//===----------------------------------------------------------------------===//
//
// This source file is part of the Soto for AWS open source project
//
// Copyright (c) 2017-2024 the Soto project authors
// Licensed under Apache License v2.0
//
// See LICENSE.txt for license information
// See CONTRIBUTORS.txt for the list of Soto project authors
//
// SPDX-License-Identifier: Apache-2.0
//
//===----------------------------------------------------------------------===//

// THIS FILE IS AUTOMATICALLY GENERATED by https://github.com/soto-project/soto-codegenerator.
// DO NOT EDIT.

#if canImport(FoundationEssentials)
import FoundationEssentials
#else
import Foundation
#endif
@_exported import SotoCore

/// Service object for interacting with AWS WorkMail service.
///
/// WorkMail is a secure, managed business email and calendaring service with support for existing desktop and mobile email clients. You can access your email, contacts, and calendars using Microsoft Outlook, your browser, or other native iOS and Android email applications. You can integrate WorkMail with your existing corporate directory and control both the keys that encrypt your data and the location in which your data is stored. The WorkMail API is designed for the following scenarios:   Listing and describing organizations     Managing users     Managing groups     Managing resources   All WorkMail API operations are Amazon-authenticated and certificate-signed. They not only require the use of the AWS SDK, but also allow for the exclusive use of AWS Identity and Access Management users and roles to help facilitate access, trust, and permission policies. By creating a role and allowing an IAM user to access the WorkMail site, the IAM user gains full administrative visibility into the entire WorkMail organization (or as set in the IAM policy). This includes, but is not limited to, the ability to create, update, and delete users, groups, and resources. This allows developers to perform the scenarios listed above, as well as give users the ability to grant access on a selective basis using the IAM model.
public struct WorkMail: AWSService {
    // MARK: Member variables

    /// Client used for communication with AWS
    public let client: AWSClient
    /// Service configuration
    public let config: AWSServiceConfig

    // MARK: Initialization

    /// Initialize the WorkMail client
    /// - parameters:
    ///     - client: AWSClient used to process requests
    ///     - region: Region of server you want to communicate with. This will override the partition parameter.
    ///     - partition: AWS partition where service resides, standard (.aws), china (.awscn), government (.awsusgov).
    ///     - endpoint: Custom endpoint URL to use instead of standard AWS servers
    ///     - middleware: Middleware chain used to edit requests before they are sent and responses before they are decoded 
    ///     - timeout: Timeout value for HTTP requests
    ///     - byteBufferAllocator: Allocator for ByteBuffers
    ///     - options: Service options
    public init(
        client: AWSClient,
        region: SotoCore.Region? = nil,
        partition: AWSPartition = .aws,
        endpoint: String? = nil,
        middleware: AWSMiddlewareProtocol? = nil,
        timeout: TimeAmount? = nil,
        byteBufferAllocator: ByteBufferAllocator = ByteBufferAllocator(),
        options: AWSServiceConfig.Options = []
    ) {
        self.client = client
        self.config = AWSServiceConfig(
            region: region,
            partition: region?.partition ?? partition,
            amzTarget: "WorkMailService",
            serviceName: "WorkMail",
            serviceIdentifier: "workmail",
            serviceProtocol: .json(version: "1.1"),
            apiVersion: "2017-10-01",
            endpoint: endpoint,
            errorType: WorkMailErrorType.self,
            middleware: middleware,
            timeout: timeout,
            byteBufferAllocator: byteBufferAllocator,
            options: options
        )
    }





    // MARK: API Calls

    /// Adds a member (user or group) to the resource's set of delegates.
    @Sendable
    @inlinable
    public func associateDelegateToResource(_ input: AssociateDelegateToResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateDelegateToResourceResponse {
        try await self.client.execute(
            operation: "AssociateDelegateToResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds a member (user or group) to the resource's set of delegates.
    ///
    /// Parameters:
    ///   - entityId: The member (user or group) to associate to the resource. The entity ID can accept UserId or GroupID, Username or Groupname, or email.   Entity: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: entity@domain.tld   Entity: entity
    ///   - organizationId: The organization under which the resource exists.
    ///   - resourceId: The resource for which members (users or groups) are associated. The identifier can accept ResourceId, Resourcename, or email. The following identity formats are available:   Resource ID: r-0123456789a0123456789b0123456789   Email address: resource@domain.tld   Resource name: resource
    ///   - logger: Logger use during operation
    @inlinable
    public func associateDelegateToResource(
        entityId: String,
        organizationId: String,
        resourceId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateDelegateToResourceResponse {
        let input = AssociateDelegateToResourceRequest(
            entityId: entityId, 
            organizationId: organizationId, 
            resourceId: resourceId
        )
        return try await self.associateDelegateToResource(input, logger: logger)
    }

    /// Adds a member (user or group) to the group's set.
    @Sendable
    @inlinable
    public func associateMemberToGroup(_ input: AssociateMemberToGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssociateMemberToGroupResponse {
        try await self.client.execute(
            operation: "AssociateMemberToGroup", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds a member (user or group) to the group's set.
    ///
    /// Parameters:
    ///   - groupId: The group to which the member (user or group) is associated. The identifier can accept GroupId, Groupname, or email. The following identity formats are available:   Group ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: group@domain.tld   Group name: group
    ///   - memberId: The member (user or group) to associate to the group. The member ID can accept UserID or GroupId, Username or Groupname, or email.   Member: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: member@domain.tld   Member name: member
    ///   - organizationId: The organization under which the group exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func associateMemberToGroup(
        groupId: String,
        memberId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssociateMemberToGroupResponse {
        let input = AssociateMemberToGroupRequest(
            groupId: groupId, 
            memberId: memberId, 
            organizationId: organizationId
        )
        return try await self.associateMemberToGroup(input, logger: logger)
    }

    /// Assumes an impersonation role for the given WorkMail organization. This method returns an authentication token you can use to make impersonated calls.
    @Sendable
    @inlinable
    public func assumeImpersonationRole(_ input: AssumeImpersonationRoleRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> AssumeImpersonationRoleResponse {
        try await self.client.execute(
            operation: "AssumeImpersonationRole", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Assumes an impersonation role for the given WorkMail organization. This method returns an authentication token you can use to make impersonated calls.
    ///
    /// Parameters:
    ///   - impersonationRoleId: The impersonation role ID to assume.
    ///   - organizationId: The WorkMail organization under which the impersonation role will be assumed.
    ///   - logger: Logger use during operation
    @inlinable
    public func assumeImpersonationRole(
        impersonationRoleId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> AssumeImpersonationRoleResponse {
        let input = AssumeImpersonationRoleRequest(
            impersonationRoleId: impersonationRoleId, 
            organizationId: organizationId
        )
        return try await self.assumeImpersonationRole(input, logger: logger)
    }

    /// Cancels a mailbox export job.  If the mailbox export job is near completion, it might not be possible to cancel it.
    @Sendable
    @inlinable
    public func cancelMailboxExportJob(_ input: CancelMailboxExportJobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CancelMailboxExportJobResponse {
        try await self.client.execute(
            operation: "CancelMailboxExportJob", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Cancels a mailbox export job.  If the mailbox export job is near completion, it might not be possible to cancel it.
    ///
    /// Parameters:
    ///   - clientToken: The idempotency token for the client request.
    ///   - jobId: The job ID.
    ///   - organizationId: The organization ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func cancelMailboxExportJob(
        clientToken: String = CancelMailboxExportJobRequest.idempotencyToken(),
        jobId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CancelMailboxExportJobResponse {
        let input = CancelMailboxExportJobRequest(
            clientToken: clientToken, 
            jobId: jobId, 
            organizationId: organizationId
        )
        return try await self.cancelMailboxExportJob(input, logger: logger)
    }

    /// Adds an alias to the set of a given member (user or group) of WorkMail.
    @Sendable
    @inlinable
    public func createAlias(_ input: CreateAliasRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateAliasResponse {
        try await self.client.execute(
            operation: "CreateAlias", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds an alias to the set of a given member (user or group) of WorkMail.
    ///
    /// Parameters:
    ///   - alias: The alias to add to the member set.
    ///   - entityId: The member (user or group) to which this alias is added.
    ///   - organizationId: The organization under which the member (user or group) exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func createAlias(
        alias: String,
        entityId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateAliasResponse {
        let input = CreateAliasRequest(
            alias: alias, 
            entityId: entityId, 
            organizationId: organizationId
        )
        return try await self.createAlias(input, logger: logger)
    }

    /// Creates an AvailabilityConfiguration for the given WorkMail organization and domain.
    @Sendable
    @inlinable
    public func createAvailabilityConfiguration(_ input: CreateAvailabilityConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateAvailabilityConfigurationResponse {
        try await self.client.execute(
            operation: "CreateAvailabilityConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an AvailabilityConfiguration for the given WorkMail organization and domain.
    ///
    /// Parameters:
    ///   - clientToken: An idempotent token that ensures that an API request is executed only once.
    ///   - domainName: The domain to which the provider applies.
    ///   - ewsProvider: Exchange Web Services (EWS) availability provider definition. The request must contain exactly one provider definition, either EwsProvider or LambdaProvider.
    ///   - lambdaProvider: Lambda availability provider definition. The request must contain exactly one provider definition, either EwsProvider or LambdaProvider.
    ///   - organizationId: The WorkMail organization for which the AvailabilityConfiguration will be created.
    ///   - logger: Logger use during operation
    @inlinable
    public func createAvailabilityConfiguration(
        clientToken: String? = CreateAvailabilityConfigurationRequest.idempotencyToken(),
        domainName: String,
        ewsProvider: EwsAvailabilityProvider? = nil,
        lambdaProvider: LambdaAvailabilityProvider? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateAvailabilityConfigurationResponse {
        let input = CreateAvailabilityConfigurationRequest(
            clientToken: clientToken, 
            domainName: domainName, 
            ewsProvider: ewsProvider, 
            lambdaProvider: lambdaProvider, 
            organizationId: organizationId
        )
        return try await self.createAvailabilityConfiguration(input, logger: logger)
    }

    /// Creates a group that can be used in WorkMail by calling the RegisterToWorkMail operation.
    @Sendable
    @inlinable
    public func createGroup(_ input: CreateGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateGroupResponse {
        try await self.client.execute(
            operation: "CreateGroup", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a group that can be used in WorkMail by calling the RegisterToWorkMail operation.
    ///
    /// Parameters:
    ///   - hiddenFromGlobalAddressList: If this parameter is enabled, the group will be hidden from the address book.
    ///   - name: The name of the group.
    ///   - organizationId: The organization under which the group is to be created.
    ///   - logger: Logger use during operation
    @inlinable
    public func createGroup(
        hiddenFromGlobalAddressList: Bool? = nil,
        name: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateGroupResponse {
        let input = CreateGroupRequest(
            hiddenFromGlobalAddressList: hiddenFromGlobalAddressList, 
            name: name, 
            organizationId: organizationId
        )
        return try await self.createGroup(input, logger: logger)
    }

    ///  Creates the WorkMail application in IAM Identity Center that can be used later in the WorkMail - IdC integration. For more information, see PutIdentityProviderConfiguration. This action does not affect the authentication settings for any WorkMail organizations.
    @Sendable
    @inlinable
    public func createIdentityCenterApplication(_ input: CreateIdentityCenterApplicationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateIdentityCenterApplicationResponse {
        try await self.client.execute(
            operation: "CreateIdentityCenterApplication", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Creates the WorkMail application in IAM Identity Center that can be used later in the WorkMail - IdC integration. For more information, see PutIdentityProviderConfiguration. This action does not affect the authentication settings for any WorkMail organizations.
    ///
    /// Parameters:
    ///   - clientToken:  The idempotency token associated with the request.
    ///   - instanceArn:  The Amazon Resource Name (ARN) of the instance.
    ///   - name:  The name of the IAM Identity Center application.
    ///   - logger: Logger use during operation
    @inlinable
    public func createIdentityCenterApplication(
        clientToken: String? = CreateIdentityCenterApplicationRequest.idempotencyToken(),
        instanceArn: String,
        name: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateIdentityCenterApplicationResponse {
        let input = CreateIdentityCenterApplicationRequest(
            clientToken: clientToken, 
            instanceArn: instanceArn, 
            name: name
        )
        return try await self.createIdentityCenterApplication(input, logger: logger)
    }

    /// Creates an impersonation role for the given WorkMail organization.  Idempotency ensures that an API request completes no more than one time. With an idempotent request, if the original request completes successfully, any subsequent retries also complete successfully without performing any further actions.
    @Sendable
    @inlinable
    public func createImpersonationRole(_ input: CreateImpersonationRoleRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateImpersonationRoleResponse {
        try await self.client.execute(
            operation: "CreateImpersonationRole", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates an impersonation role for the given WorkMail organization.  Idempotency ensures that an API request completes no more than one time. With an idempotent request, if the original request completes successfully, any subsequent retries also complete successfully without performing any further actions.
    ///
    /// Parameters:
    ///   - clientToken: The idempotency token for the client request.
    ///   - description: The description of the new impersonation role.
    ///   - name: The name of the new impersonation role.
    ///   - organizationId: The WorkMail organization to create the new impersonation role within.
    ///   - rules: The list of rules for the impersonation role.
    ///   - type: The impersonation role's type. The available impersonation role types are READ_ONLY or FULL_ACCESS.
    ///   - logger: Logger use during operation
    @inlinable
    public func createImpersonationRole(
        clientToken: String? = CreateImpersonationRoleRequest.idempotencyToken(),
        description: String? = nil,
        name: String,
        organizationId: String,
        rules: [ImpersonationRule],
        type: ImpersonationRoleType,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateImpersonationRoleResponse {
        let input = CreateImpersonationRoleRequest(
            clientToken: clientToken, 
            description: description, 
            name: name, 
            organizationId: organizationId, 
            rules: rules, 
            type: type
        )
        return try await self.createImpersonationRole(input, logger: logger)
    }

    /// Creates a new mobile device access rule for the specified WorkMail organization.
    @Sendable
    @inlinable
    public func createMobileDeviceAccessRule(_ input: CreateMobileDeviceAccessRuleRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateMobileDeviceAccessRuleResponse {
        try await self.client.execute(
            operation: "CreateMobileDeviceAccessRule", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new mobile device access rule for the specified WorkMail organization.
    ///
    /// Parameters:
    ///   - clientToken: The idempotency token for the client request.
    ///   - description: The rule description.
    ///   - deviceModels: Device models that the rule will match.
    ///   - deviceOperatingSystems: Device operating systems that the rule will match.
    ///   - deviceTypes: Device types that the rule will match.
    ///   - deviceUserAgents: Device user agents that the rule will match.
    ///   - effect: The effect of the rule when it matches. Allowed values are ALLOW or DENY.
    ///   - name: The rule name.
    ///   - notDeviceModels: Device models that the rule will not match. All other device models will match.
    ///   - notDeviceOperatingSystems: Device operating systems that the rule will not match. All other device operating systems will match.
    ///   - notDeviceTypes: Device types that the rule will not match. All other device types will match.
    ///   - notDeviceUserAgents: Device user agents that the rule will not match. All other device user agents will match.
    ///   - organizationId: The WorkMail organization under which the rule will be created.
    ///   - logger: Logger use during operation
    @inlinable
    public func createMobileDeviceAccessRule(
        clientToken: String? = CreateMobileDeviceAccessRuleRequest.idempotencyToken(),
        description: String? = nil,
        deviceModels: [String]? = nil,
        deviceOperatingSystems: [String]? = nil,
        deviceTypes: [String]? = nil,
        deviceUserAgents: [String]? = nil,
        effect: MobileDeviceAccessRuleEffect,
        name: String,
        notDeviceModels: [String]? = nil,
        notDeviceOperatingSystems: [String]? = nil,
        notDeviceTypes: [String]? = nil,
        notDeviceUserAgents: [String]? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateMobileDeviceAccessRuleResponse {
        let input = CreateMobileDeviceAccessRuleRequest(
            clientToken: clientToken, 
            description: description, 
            deviceModels: deviceModels, 
            deviceOperatingSystems: deviceOperatingSystems, 
            deviceTypes: deviceTypes, 
            deviceUserAgents: deviceUserAgents, 
            effect: effect, 
            name: name, 
            notDeviceModels: notDeviceModels, 
            notDeviceOperatingSystems: notDeviceOperatingSystems, 
            notDeviceTypes: notDeviceTypes, 
            notDeviceUserAgents: notDeviceUserAgents, 
            organizationId: organizationId
        )
        return try await self.createMobileDeviceAccessRule(input, logger: logger)
    }

    /// Creates a new WorkMail organization. Optionally, you can choose to associate an existing AWS Directory Service directory with your organization. If an AWS Directory Service directory ID is specified, the organization alias must match the directory alias. If you choose not to associate an existing directory with your organization, then we create a new WorkMail directory for you. For more information, see Adding an organization in the WorkMail Administrator Guide. You can associate multiple email domains with an organization, then choose your default email domain from the WorkMail console. You can also associate a domain that is managed in an Amazon Route 53 public hosted zone. For more information, see Adding a domain and Choosing the default domain in the WorkMail Administrator Guide. Optionally, you can use a customer managed key from AWS Key Management Service (AWS KMS) to encrypt email for your organization. If you don't associate an AWS KMS key, WorkMail creates a default, AWS managed key for you.
    @Sendable
    @inlinable
    public func createOrganization(_ input: CreateOrganizationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateOrganizationResponse {
        try await self.client.execute(
            operation: "CreateOrganization", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new WorkMail organization. Optionally, you can choose to associate an existing AWS Directory Service directory with your organization. If an AWS Directory Service directory ID is specified, the organization alias must match the directory alias. If you choose not to associate an existing directory with your organization, then we create a new WorkMail directory for you. For more information, see Adding an organization in the WorkMail Administrator Guide. You can associate multiple email domains with an organization, then choose your default email domain from the WorkMail console. You can also associate a domain that is managed in an Amazon Route 53 public hosted zone. For more information, see Adding a domain and Choosing the default domain in the WorkMail Administrator Guide. Optionally, you can use a customer managed key from AWS Key Management Service (AWS KMS) to encrypt email for your organization. If you don't associate an AWS KMS key, WorkMail creates a default, AWS managed key for you.
    ///
    /// Parameters:
    ///   - alias: The organization alias.
    ///   - clientToken: The idempotency token associated with the request.
    ///   - directoryId: The AWS Directory Service directory ID.
    ///   - domains: The email domains to associate with the organization.
    ///   - enableInteroperability: When true, allows organization interoperability between WorkMail and Microsoft Exchange. If true, you must include a AD Connector directory ID in the request.
    ///   - kmsKeyArn: The Amazon Resource Name (ARN) of a customer managed key from AWS KMS.
    ///   - logger: Logger use during operation
    @inlinable
    public func createOrganization(
        alias: String,
        clientToken: String? = CreateOrganizationRequest.idempotencyToken(),
        directoryId: String? = nil,
        domains: [Domain]? = nil,
        enableInteroperability: Bool? = nil,
        kmsKeyArn: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateOrganizationResponse {
        let input = CreateOrganizationRequest(
            alias: alias, 
            clientToken: clientToken, 
            directoryId: directoryId, 
            domains: domains, 
            enableInteroperability: enableInteroperability, 
            kmsKeyArn: kmsKeyArn
        )
        return try await self.createOrganization(input, logger: logger)
    }

    /// Creates a new WorkMail resource.
    @Sendable
    @inlinable
    public func createResource(_ input: CreateResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateResourceResponse {
        try await self.client.execute(
            operation: "CreateResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a new WorkMail resource.
    ///
    /// Parameters:
    ///   - description: Resource description.
    ///   - hiddenFromGlobalAddressList: If this parameter is enabled, the resource will be hidden from the address book.
    ///   - name: The name of the new resource.
    ///   - organizationId: The identifier associated with the organization for which the resource is created.
    ///   - type: The type of the new resource. The available types are equipment and room.
    ///   - logger: Logger use during operation
    @inlinable
    public func createResource(
        description: String? = nil,
        hiddenFromGlobalAddressList: Bool? = nil,
        name: String,
        organizationId: String,
        type: ResourceType,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateResourceResponse {
        let input = CreateResourceRequest(
            description: description, 
            hiddenFromGlobalAddressList: hiddenFromGlobalAddressList, 
            name: name, 
            organizationId: organizationId, 
            type: type
        )
        return try await self.createResource(input, logger: logger)
    }

    /// Creates a user who can be used in WorkMail by calling the RegisterToWorkMail operation.
    @Sendable
    @inlinable
    public func createUser(_ input: CreateUserRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> CreateUserResponse {
        try await self.client.execute(
            operation: "CreateUser", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a user who can be used in WorkMail by calling the RegisterToWorkMail operation.
    ///
    /// Parameters:
    ///   - displayName: The display name for the new user.
    ///   - firstName: The first name of the new user.
    ///   - hiddenFromGlobalAddressList: If this parameter is enabled, the user will be hidden from the address book.
    ///   - identityProviderUserId: User ID from the IAM Identity Center. If this parameter is empty it will be updated automatically when the user logs in for the first time to the mailbox associated with WorkMail.
    ///   - lastName: The last name of the new user.
    ///   - name: The name for the new user. WorkMail directory user names have a maximum length of 64. All others have a maximum length of 20.
    ///   - organizationId: The identifier of the organization for which the user is created.
    ///   - password: The password for the new user.
    ///   - role: The role of the new user. You cannot pass SYSTEM_USER or RESOURCE role in a single request. When a user role is not selected, the default role of USER is selected.
    ///   - logger: Logger use during operation
    @inlinable
    public func createUser(
        displayName: String,
        firstName: String? = nil,
        hiddenFromGlobalAddressList: Bool? = nil,
        identityProviderUserId: String? = nil,
        lastName: String? = nil,
        name: String,
        organizationId: String,
        password: String? = nil,
        role: UserRole? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> CreateUserResponse {
        let input = CreateUserRequest(
            displayName: displayName, 
            firstName: firstName, 
            hiddenFromGlobalAddressList: hiddenFromGlobalAddressList, 
            identityProviderUserId: identityProviderUserId, 
            lastName: lastName, 
            name: name, 
            organizationId: organizationId, 
            password: password, 
            role: role
        )
        return try await self.createUser(input, logger: logger)
    }

    /// Deletes an access control rule for the specified WorkMail organization.  Deleting already deleted and non-existing rules does not produce an error. In those cases, the service sends back an HTTP 200 response with an empty HTTP body.
    @Sendable
    @inlinable
    public func deleteAccessControlRule(_ input: DeleteAccessControlRuleRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteAccessControlRuleResponse {
        try await self.client.execute(
            operation: "DeleteAccessControlRule", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an access control rule for the specified WorkMail organization.  Deleting already deleted and non-existing rules does not produce an error. In those cases, the service sends back an HTTP 200 response with an empty HTTP body.
    ///
    /// Parameters:
    ///   - name: The name of the access control rule.
    ///   - organizationId: The identifier for the organization.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteAccessControlRule(
        name: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteAccessControlRuleResponse {
        let input = DeleteAccessControlRuleRequest(
            name: name, 
            organizationId: organizationId
        )
        return try await self.deleteAccessControlRule(input, logger: logger)
    }

    /// Remove one or more specified aliases from a set of aliases for a given user.
    @Sendable
    @inlinable
    public func deleteAlias(_ input: DeleteAliasRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteAliasResponse {
        try await self.client.execute(
            operation: "DeleteAlias", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Remove one or more specified aliases from a set of aliases for a given user.
    ///
    /// Parameters:
    ///   - alias: The aliases to be removed from the user's set of aliases. Duplicate entries in the list are collapsed into single entries (the list is transformed into a set).
    ///   - entityId: The identifier for the member (user or group) from which to have the aliases removed.
    ///   - organizationId: The identifier for the organization under which the user exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteAlias(
        alias: String,
        entityId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteAliasResponse {
        let input = DeleteAliasRequest(
            alias: alias, 
            entityId: entityId, 
            organizationId: organizationId
        )
        return try await self.deleteAlias(input, logger: logger)
    }

    /// Deletes the AvailabilityConfiguration for the given WorkMail organization and domain.
    @Sendable
    @inlinable
    public func deleteAvailabilityConfiguration(_ input: DeleteAvailabilityConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteAvailabilityConfigurationResponse {
        try await self.client.execute(
            operation: "DeleteAvailabilityConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the AvailabilityConfiguration for the given WorkMail organization and domain.
    ///
    /// Parameters:
    ///   - domainName: The domain for which the AvailabilityConfiguration will be deleted.
    ///   - organizationId: The WorkMail organization for which the AvailabilityConfiguration will be deleted.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteAvailabilityConfiguration(
        domainName: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteAvailabilityConfigurationResponse {
        let input = DeleteAvailabilityConfigurationRequest(
            domainName: domainName, 
            organizationId: organizationId
        )
        return try await self.deleteAvailabilityConfiguration(input, logger: logger)
    }

    /// Deletes the email monitoring configuration for a specified organization.
    @Sendable
    @inlinable
    public func deleteEmailMonitoringConfiguration(_ input: DeleteEmailMonitoringConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteEmailMonitoringConfigurationResponse {
        try await self.client.execute(
            operation: "DeleteEmailMonitoringConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the email monitoring configuration for a specified organization.
    ///
    /// Parameters:
    ///   - organizationId: The ID of the organization from which the email monitoring configuration is deleted.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteEmailMonitoringConfiguration(
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteEmailMonitoringConfigurationResponse {
        let input = DeleteEmailMonitoringConfigurationRequest(
            organizationId: organizationId
        )
        return try await self.deleteEmailMonitoringConfiguration(input, logger: logger)
    }

    /// Deletes a group from WorkMail.
    @Sendable
    @inlinable
    public func deleteGroup(_ input: DeleteGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteGroupResponse {
        try await self.client.execute(
            operation: "DeleteGroup", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a group from WorkMail.
    ///
    /// Parameters:
    ///   - groupId: The identifier of the group to be deleted. The identifier can be the GroupId, or Groupname. The following identity formats are available:   Group ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Group name: group
    ///   - organizationId: The organization that contains the group.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteGroup(
        groupId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteGroupResponse {
        let input = DeleteGroupRequest(
            groupId: groupId, 
            organizationId: organizationId
        )
        return try await self.deleteGroup(input, logger: logger)
    }

    ///  Deletes the IAM Identity Center application from WorkMail. This action does not affect the authentication settings for any WorkMail organizations.
    @Sendable
    @inlinable
    public func deleteIdentityCenterApplication(_ input: DeleteIdentityCenterApplicationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteIdentityCenterApplicationResponse {
        try await self.client.execute(
            operation: "DeleteIdentityCenterApplication", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Deletes the IAM Identity Center application from WorkMail. This action does not affect the authentication settings for any WorkMail organizations.
    ///
    /// Parameters:
    ///   - applicationArn:  The Amazon Resource Name (ARN) of the application.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteIdentityCenterApplication(
        applicationArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteIdentityCenterApplicationResponse {
        let input = DeleteIdentityCenterApplicationRequest(
            applicationArn: applicationArn
        )
        return try await self.deleteIdentityCenterApplication(input, logger: logger)
    }

    ///  Disables the integration between IdC and WorkMail. Authentication will continue with the directory as it was before the IdC integration. You might have to reset your directory passwords and reconfigure your desktop and mobile email clients.
    @Sendable
    @inlinable
    public func deleteIdentityProviderConfiguration(_ input: DeleteIdentityProviderConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteIdentityProviderConfigurationResponse {
        try await self.client.execute(
            operation: "DeleteIdentityProviderConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Disables the integration between IdC and WorkMail. Authentication will continue with the directory as it was before the IdC integration. You might have to reset your directory passwords and reconfigure your desktop and mobile email clients.
    ///
    /// Parameters:
    ///   - organizationId: The Organization ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteIdentityProviderConfiguration(
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteIdentityProviderConfigurationResponse {
        let input = DeleteIdentityProviderConfigurationRequest(
            organizationId: organizationId
        )
        return try await self.deleteIdentityProviderConfiguration(input, logger: logger)
    }

    /// Deletes an impersonation role for the given WorkMail organization.
    @Sendable
    @inlinable
    public func deleteImpersonationRole(_ input: DeleteImpersonationRoleRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteImpersonationRoleResponse {
        try await self.client.execute(
            operation: "DeleteImpersonationRole", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an impersonation role for the given WorkMail organization.
    ///
    /// Parameters:
    ///   - impersonationRoleId: The ID of the impersonation role to delete.
    ///   - organizationId: The WorkMail organization from which to delete the impersonation role.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteImpersonationRole(
        impersonationRoleId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteImpersonationRoleResponse {
        let input = DeleteImpersonationRoleRequest(
            impersonationRoleId: impersonationRoleId, 
            organizationId: organizationId
        )
        return try await self.deleteImpersonationRole(input, logger: logger)
    }

    /// Deletes permissions granted to a member (user or group).
    @Sendable
    @inlinable
    public func deleteMailboxPermissions(_ input: DeleteMailboxPermissionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteMailboxPermissionsResponse {
        try await self.client.execute(
            operation: "DeleteMailboxPermissions", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes permissions granted to a member (user or group).
    ///
    /// Parameters:
    ///   - entityId: The identifier of the entity that owns the mailbox. The identifier can be UserId or Group Id, Username or Groupname, or email.   Entity ID: 12345678-1234-1234-1234-123456789012, r-0123456789a0123456789b0123456789, or S-1-1-12-1234567890-123456789-123456789-1234   Email address: entity@domain.tld   Entity name: entity
    ///   - granteeId: The identifier of the entity for which to delete granted permissions. The identifier can be UserId, ResourceID, or Group Id, Username or Groupname, or email.   Grantee ID: 12345678-1234-1234-1234-123456789012,r-0123456789a0123456789b0123456789, or S-1-1-12-1234567890-123456789-123456789-1234   Email address: grantee@domain.tld   Grantee name: grantee
    ///   - organizationId: The identifier of the organization under which the member (user or group) exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteMailboxPermissions(
        entityId: String,
        granteeId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteMailboxPermissionsResponse {
        let input = DeleteMailboxPermissionsRequest(
            entityId: entityId, 
            granteeId: granteeId, 
            organizationId: organizationId
        )
        return try await self.deleteMailboxPermissions(input, logger: logger)
    }

    /// Deletes the mobile device access override for the given WorkMail organization, user, and device.  Deleting already deleted and non-existing overrides does not produce an error. In those cases, the service sends back an HTTP 200 response with an empty HTTP body.
    @Sendable
    @inlinable
    public func deleteMobileDeviceAccessOverride(_ input: DeleteMobileDeviceAccessOverrideRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteMobileDeviceAccessOverrideResponse {
        try await self.client.execute(
            operation: "DeleteMobileDeviceAccessOverride", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the mobile device access override for the given WorkMail organization, user, and device.  Deleting already deleted and non-existing overrides does not produce an error. In those cases, the service sends back an HTTP 200 response with an empty HTTP body.
    ///
    /// Parameters:
    ///   - deviceId: The mobile device for which you delete the override. DeviceId is case insensitive.
    ///   - organizationId: The WorkMail organization for which the access override will be deleted.
    ///   - userId: The WorkMail user for which you want to delete the override. Accepts the following types of user identities:   User ID:  12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234    Email address: user@domain.tld    User name: user
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteMobileDeviceAccessOverride(
        deviceId: String,
        organizationId: String,
        userId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteMobileDeviceAccessOverrideResponse {
        let input = DeleteMobileDeviceAccessOverrideRequest(
            deviceId: deviceId, 
            organizationId: organizationId, 
            userId: userId
        )
        return try await self.deleteMobileDeviceAccessOverride(input, logger: logger)
    }

    /// Deletes a mobile device access rule for the specified WorkMail organization.  Deleting already deleted and non-existing rules does not produce an error. In those cases, the service sends back an HTTP 200 response with an empty HTTP body.
    @Sendable
    @inlinable
    public func deleteMobileDeviceAccessRule(_ input: DeleteMobileDeviceAccessRuleRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteMobileDeviceAccessRuleResponse {
        try await self.client.execute(
            operation: "DeleteMobileDeviceAccessRule", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a mobile device access rule for the specified WorkMail organization.  Deleting already deleted and non-existing rules does not produce an error. In those cases, the service sends back an HTTP 200 response with an empty HTTP body.
    ///
    /// Parameters:
    ///   - mobileDeviceAccessRuleId: The identifier of the rule to be deleted.
    ///   - organizationId: The WorkMail organization under which the rule will be deleted.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteMobileDeviceAccessRule(
        mobileDeviceAccessRuleId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteMobileDeviceAccessRuleResponse {
        let input = DeleteMobileDeviceAccessRuleRequest(
            mobileDeviceAccessRuleId: mobileDeviceAccessRuleId, 
            organizationId: organizationId
        )
        return try await self.deleteMobileDeviceAccessRule(input, logger: logger)
    }

    /// Deletes an WorkMail organization and all underlying AWS resources managed by WorkMail as part of the organization. You can choose whether to delete the associated directory. For more information, see Removing an organization in the WorkMail Administrator Guide.
    @Sendable
    @inlinable
    public func deleteOrganization(_ input: DeleteOrganizationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteOrganizationResponse {
        try await self.client.execute(
            operation: "DeleteOrganization", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes an WorkMail organization and all underlying AWS resources managed by WorkMail as part of the organization. You can choose whether to delete the associated directory. For more information, see Removing an organization in the WorkMail Administrator Guide.
    ///
    /// Parameters:
    ///   - clientToken: The idempotency token associated with the request.
    ///   - deleteDirectory: If true, deletes the AWS Directory Service directory associated with the organization.
    ///   - deleteIdentityCenterApplication: Deletes IAM Identity Center application for WorkMail. This action does not affect authentication settings for any organization.
    ///   - forceDelete: Deletes a WorkMail organization even if the organization has enabled users.
    ///   - organizationId: The organization ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteOrganization(
        clientToken: String? = DeleteOrganizationRequest.idempotencyToken(),
        deleteDirectory: Bool = false,
        deleteIdentityCenterApplication: Bool? = nil,
        forceDelete: Bool? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteOrganizationResponse {
        let input = DeleteOrganizationRequest(
            clientToken: clientToken, 
            deleteDirectory: deleteDirectory, 
            deleteIdentityCenterApplication: deleteIdentityCenterApplication, 
            forceDelete: forceDelete, 
            organizationId: organizationId
        )
        return try await self.deleteOrganization(input, logger: logger)
    }

    ///  Deletes the Personal Access Token from the provided WorkMail Organization.
    @Sendable
    @inlinable
    public func deletePersonalAccessToken(_ input: DeletePersonalAccessTokenRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeletePersonalAccessTokenResponse {
        try await self.client.execute(
            operation: "DeletePersonalAccessToken", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Deletes the Personal Access Token from the provided WorkMail Organization.
    ///
    /// Parameters:
    ///   - organizationId:  The Organization ID.
    ///   - personalAccessTokenId:  The Personal Access Token ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func deletePersonalAccessToken(
        organizationId: String,
        personalAccessTokenId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeletePersonalAccessTokenResponse {
        let input = DeletePersonalAccessTokenRequest(
            organizationId: organizationId, 
            personalAccessTokenId: personalAccessTokenId
        )
        return try await self.deletePersonalAccessToken(input, logger: logger)
    }

    /// Deletes the specified resource.
    @Sendable
    @inlinable
    public func deleteResource(_ input: DeleteResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteResourceResponse {
        try await self.client.execute(
            operation: "DeleteResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the specified resource.
    ///
    /// Parameters:
    ///   - organizationId: The identifier associated with the organization from which the resource is deleted.
    ///   - resourceId: The identifier of the resource to be deleted. The identifier can accept ResourceId, or Resourcename. The following identity formats are available:   Resource ID: r-0123456789a0123456789b0123456789   Resource name: resource
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteResource(
        organizationId: String,
        resourceId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteResourceResponse {
        let input = DeleteResourceRequest(
            organizationId: organizationId, 
            resourceId: resourceId
        )
        return try await self.deleteResource(input, logger: logger)
    }

    /// Deletes the specified retention policy from the specified organization.
    @Sendable
    @inlinable
    public func deleteRetentionPolicy(_ input: DeleteRetentionPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteRetentionPolicyResponse {
        try await self.client.execute(
            operation: "DeleteRetentionPolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes the specified retention policy from the specified organization.
    ///
    /// Parameters:
    ///   - id: The retention policy ID.
    ///   - organizationId: The organization ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteRetentionPolicy(
        id: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteRetentionPolicyResponse {
        let input = DeleteRetentionPolicyRequest(
            id: id, 
            organizationId: organizationId
        )
        return try await self.deleteRetentionPolicy(input, logger: logger)
    }

    /// Deletes a user from WorkMail and all subsequent systems. Before you can delete a user, the user state must be DISABLED. Use the DescribeUser action to confirm the user state. Deleting a user is permanent and cannot be undone. WorkMail archives user mailboxes for 30 days before they are permanently removed.
    @Sendable
    @inlinable
    public func deleteUser(_ input: DeleteUserRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeleteUserResponse {
        try await self.client.execute(
            operation: "DeleteUser", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Deletes a user from WorkMail and all subsequent systems. Before you can delete a user, the user state must be DISABLED. Use the DescribeUser action to confirm the user state. Deleting a user is permanent and cannot be undone. WorkMail archives user mailboxes for 30 days before they are permanently removed.
    ///
    /// Parameters:
    ///   - organizationId: The organization that contains the user to be deleted.
    ///   - userId: The identifier of the user to be deleted. The identifier can be the UserId or Username. The following identity formats are available:   User ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   User name: user
    ///   - logger: Logger use during operation
    @inlinable
    public func deleteUser(
        organizationId: String,
        userId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeleteUserResponse {
        let input = DeleteUserRequest(
            organizationId: organizationId, 
            userId: userId
        )
        return try await self.deleteUser(input, logger: logger)
    }

    /// Mark a user, group, or resource as no longer used in WorkMail. This action disassociates the mailbox and schedules it for clean-up. WorkMail keeps mailboxes for 30 days before they are permanently removed. The functionality in the console is Disable.
    @Sendable
    @inlinable
    public func deregisterFromWorkMail(_ input: DeregisterFromWorkMailRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeregisterFromWorkMailResponse {
        try await self.client.execute(
            operation: "DeregisterFromWorkMail", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Mark a user, group, or resource as no longer used in WorkMail. This action disassociates the mailbox and schedules it for clean-up. WorkMail keeps mailboxes for 30 days before they are permanently removed. The functionality in the console is Disable.
    ///
    /// Parameters:
    ///   - entityId: The identifier for the member to be updated. The identifier can be UserId, ResourceId, or Group Id, Username, Resourcename, or Groupname, or email.   Entity ID: 12345678-1234-1234-1234-123456789012, r-0123456789a0123456789b0123456789, or S-1-1-12-1234567890-123456789-123456789-1234   Email address: entity@domain.tld   Entity name: entity
    ///   - organizationId: The identifier for the organization under which the WorkMail entity exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func deregisterFromWorkMail(
        entityId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeregisterFromWorkMailResponse {
        let input = DeregisterFromWorkMailRequest(
            entityId: entityId, 
            organizationId: organizationId
        )
        return try await self.deregisterFromWorkMail(input, logger: logger)
    }

    /// Removes a domain from WorkMail, stops email routing to WorkMail, and removes the authorization allowing WorkMail use. SES keeps the domain because other applications may use it. You must first  remove any email address used by WorkMail entities before you remove the domain.
    @Sendable
    @inlinable
    public func deregisterMailDomain(_ input: DeregisterMailDomainRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DeregisterMailDomainResponse {
        try await self.client.execute(
            operation: "DeregisterMailDomain", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes a domain from WorkMail, stops email routing to WorkMail, and removes the authorization allowing WorkMail use. SES keeps the domain because other applications may use it. You must first  remove any email address used by WorkMail entities before you remove the domain.
    ///
    /// Parameters:
    ///   - domainName: The domain to deregister in WorkMail and SES.
    ///   - organizationId: The WorkMail organization for which the domain will be deregistered.
    ///   - logger: Logger use during operation
    @inlinable
    public func deregisterMailDomain(
        domainName: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DeregisterMailDomainResponse {
        let input = DeregisterMailDomainRequest(
            domainName: domainName, 
            organizationId: organizationId
        )
        return try await self.deregisterMailDomain(input, logger: logger)
    }

    /// Describes the current email monitoring configuration for a specified organization.
    @Sendable
    @inlinable
    public func describeEmailMonitoringConfiguration(_ input: DescribeEmailMonitoringConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeEmailMonitoringConfigurationResponse {
        try await self.client.execute(
            operation: "DescribeEmailMonitoringConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Describes the current email monitoring configuration for a specified organization.
    ///
    /// Parameters:
    ///   - organizationId: The ID of the organization for which the email monitoring configuration is described.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeEmailMonitoringConfiguration(
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeEmailMonitoringConfigurationResponse {
        let input = DescribeEmailMonitoringConfigurationRequest(
            organizationId: organizationId
        )
        return try await self.describeEmailMonitoringConfiguration(input, logger: logger)
    }

    /// Returns basic details about an entity in WorkMail.
    @Sendable
    @inlinable
    public func describeEntity(_ input: DescribeEntityRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeEntityResponse {
        try await self.client.execute(
            operation: "DescribeEntity", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns basic details about an entity in WorkMail.
    ///
    /// Parameters:
    ///   - email: The email under which the entity exists.
    ///   - organizationId: The identifier for the organization under which the entity exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeEntity(
        email: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeEntityResponse {
        let input = DescribeEntityRequest(
            email: email, 
            organizationId: organizationId
        )
        return try await self.describeEntity(input, logger: logger)
    }

    /// Returns the data available for the group.
    @Sendable
    @inlinable
    public func describeGroup(_ input: DescribeGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeGroupResponse {
        try await self.client.execute(
            operation: "DescribeGroup", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the data available for the group.
    ///
    /// Parameters:
    ///   - groupId: The identifier for the group to be described. The identifier can accept GroupId, Groupname, or email. The following identity formats are available:   Group ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: group@domain.tld   Group name: group
    ///   - organizationId: The identifier for the organization under which the group exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeGroup(
        groupId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeGroupResponse {
        let input = DescribeGroupRequest(
            groupId: groupId, 
            organizationId: organizationId
        )
        return try await self.describeGroup(input, logger: logger)
    }

    ///  Returns detailed information on the current IdC setup for the WorkMail organization.
    @Sendable
    @inlinable
    public func describeIdentityProviderConfiguration(_ input: DescribeIdentityProviderConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeIdentityProviderConfigurationResponse {
        try await self.client.execute(
            operation: "DescribeIdentityProviderConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns detailed information on the current IdC setup for the WorkMail organization.
    ///
    /// Parameters:
    ///   - organizationId:  The Organization ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeIdentityProviderConfiguration(
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeIdentityProviderConfigurationResponse {
        let input = DescribeIdentityProviderConfigurationRequest(
            organizationId: organizationId
        )
        return try await self.describeIdentityProviderConfiguration(input, logger: logger)
    }

    /// Lists the settings in a DMARC policy for a specified organization.
    @Sendable
    @inlinable
    public func describeInboundDmarcSettings(_ input: DescribeInboundDmarcSettingsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeInboundDmarcSettingsResponse {
        try await self.client.execute(
            operation: "DescribeInboundDmarcSettings", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the settings in a DMARC policy for a specified organization.
    ///
    /// Parameters:
    ///   - organizationId: Lists the ID of the given organization.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeInboundDmarcSettings(
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeInboundDmarcSettingsResponse {
        let input = DescribeInboundDmarcSettingsRequest(
            organizationId: organizationId
        )
        return try await self.describeInboundDmarcSettings(input, logger: logger)
    }

    /// Describes the current status of a mailbox export job.
    @Sendable
    @inlinable
    public func describeMailboxExportJob(_ input: DescribeMailboxExportJobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeMailboxExportJobResponse {
        try await self.client.execute(
            operation: "DescribeMailboxExportJob", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Describes the current status of a mailbox export job.
    ///
    /// Parameters:
    ///   - jobId: The mailbox export job ID.
    ///   - organizationId: The organization ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeMailboxExportJob(
        jobId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeMailboxExportJobResponse {
        let input = DescribeMailboxExportJobRequest(
            jobId: jobId, 
            organizationId: organizationId
        )
        return try await self.describeMailboxExportJob(input, logger: logger)
    }

    /// Provides more information regarding a given organization based on its identifier.
    @Sendable
    @inlinable
    public func describeOrganization(_ input: DescribeOrganizationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeOrganizationResponse {
        try await self.client.execute(
            operation: "DescribeOrganization", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides more information regarding a given organization based on its identifier.
    ///
    /// Parameters:
    ///   - organizationId: The identifier for the organization to be described.
    ///   - logger: Logger use during operation
    @inlinable
    public func describeOrganization(
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeOrganizationResponse {
        let input = DescribeOrganizationRequest(
            organizationId: organizationId
        )
        return try await self.describeOrganization(input, logger: logger)
    }

    /// Returns the data available for the resource.
    @Sendable
    @inlinable
    public func describeResource(_ input: DescribeResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeResourceResponse {
        try await self.client.execute(
            operation: "DescribeResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns the data available for the resource.
    ///
    /// Parameters:
    ///   - organizationId: The identifier associated with the organization for which the resource is described.
    ///   - resourceId: The identifier of the resource to be described. The identifier can accept ResourceId, Resourcename, or email. The following identity formats are available:   Resource ID: r-0123456789a0123456789b0123456789   Email address: resource@domain.tld   Resource name: resource
    ///   - logger: Logger use during operation
    @inlinable
    public func describeResource(
        organizationId: String,
        resourceId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeResourceResponse {
        let input = DescribeResourceRequest(
            organizationId: organizationId, 
            resourceId: resourceId
        )
        return try await self.describeResource(input, logger: logger)
    }

    /// Provides information regarding the user.
    @Sendable
    @inlinable
    public func describeUser(_ input: DescribeUserRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DescribeUserResponse {
        try await self.client.execute(
            operation: "DescribeUser", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Provides information regarding the user.
    ///
    /// Parameters:
    ///   - organizationId: The identifier for the organization under which the user exists.
    ///   - userId: The identifier for the user to be described. The identifier can be the UserId, Username, or email. The following identity formats are available:   User ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: user@domain.tld   User name: user
    ///   - logger: Logger use during operation
    @inlinable
    public func describeUser(
        organizationId: String,
        userId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DescribeUserResponse {
        let input = DescribeUserRequest(
            organizationId: organizationId, 
            userId: userId
        )
        return try await self.describeUser(input, logger: logger)
    }

    /// Removes a member from the resource's set of delegates.
    @Sendable
    @inlinable
    public func disassociateDelegateFromResource(_ input: DisassociateDelegateFromResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateDelegateFromResourceResponse {
        try await self.client.execute(
            operation: "DisassociateDelegateFromResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes a member from the resource's set of delegates.
    ///
    /// Parameters:
    ///   - entityId: The identifier for the member (user, group) to be removed from the resource's delegates. The entity ID can accept UserId or GroupID, Username or Groupname, or email.   Entity: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: entity@domain.tld   Entity: entity
    ///   - organizationId: The identifier for the organization under which the resource exists.
    ///   - resourceId: The identifier of the resource from which delegates' set members are removed.  The identifier can accept ResourceId, Resourcename, or email. The following identity formats are available:   Resource ID: r-0123456789a0123456789b0123456789   Email address: resource@domain.tld   Resource name: resource
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateDelegateFromResource(
        entityId: String,
        organizationId: String,
        resourceId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateDelegateFromResourceResponse {
        let input = DisassociateDelegateFromResourceRequest(
            entityId: entityId, 
            organizationId: organizationId, 
            resourceId: resourceId
        )
        return try await self.disassociateDelegateFromResource(input, logger: logger)
    }

    /// Removes a member from a group.
    @Sendable
    @inlinable
    public func disassociateMemberFromGroup(_ input: DisassociateMemberFromGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> DisassociateMemberFromGroupResponse {
        try await self.client.execute(
            operation: "DisassociateMemberFromGroup", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Removes a member from a group.
    ///
    /// Parameters:
    ///   - groupId: The identifier for the group from which members are removed. The identifier can accept GroupId, Groupname, or email. The following identity formats are available:   Group ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: group@domain.tld   Group name: group
    ///   - memberId: The identifier for the member to be removed from the group. The member ID can accept UserID or GroupId, Username or Groupname, or email.   Member ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: member@domain.tld   Member name: member
    ///   - organizationId: The identifier for the organization under which the group exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func disassociateMemberFromGroup(
        groupId: String,
        memberId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> DisassociateMemberFromGroupResponse {
        let input = DisassociateMemberFromGroupRequest(
            groupId: groupId, 
            memberId: memberId, 
            organizationId: organizationId
        )
        return try await self.disassociateMemberFromGroup(input, logger: logger)
    }

    /// Gets the effects of an organization's access control rules as they apply to a specified IPv4 address, access protocol action, and  user ID or impersonation role ID. You must provide either the user ID or impersonation role ID. Impersonation role ID can only be used with Action EWS.
    @Sendable
    @inlinable
    public func getAccessControlEffect(_ input: GetAccessControlEffectRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetAccessControlEffectResponse {
        try await self.client.execute(
            operation: "GetAccessControlEffect", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets the effects of an organization's access control rules as they apply to a specified IPv4 address, access protocol action, and  user ID or impersonation role ID. You must provide either the user ID or impersonation role ID. Impersonation role ID can only be used with Action EWS.
    ///
    /// Parameters:
    ///   - action: The access protocol action. Valid values include ActiveSync, AutoDiscover, EWS, IMAP, SMTP, WindowsOutlook, and WebMail.
    ///   - impersonationRoleId: The impersonation role ID.
    ///   - ipAddress: The IPv4 address.
    ///   - organizationId: The identifier for the organization.
    ///   - userId: The user ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func getAccessControlEffect(
        action: String,
        impersonationRoleId: String? = nil,
        ipAddress: String,
        organizationId: String,
        userId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetAccessControlEffectResponse {
        let input = GetAccessControlEffectRequest(
            action: action, 
            impersonationRoleId: impersonationRoleId, 
            ipAddress: ipAddress, 
            organizationId: organizationId, 
            userId: userId
        )
        return try await self.getAccessControlEffect(input, logger: logger)
    }

    /// Gets the default retention policy details for the specified organization.
    @Sendable
    @inlinable
    public func getDefaultRetentionPolicy(_ input: GetDefaultRetentionPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetDefaultRetentionPolicyResponse {
        try await self.client.execute(
            operation: "GetDefaultRetentionPolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets the default retention policy details for the specified organization.
    ///
    /// Parameters:
    ///   - organizationId: The organization ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func getDefaultRetentionPolicy(
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetDefaultRetentionPolicyResponse {
        let input = GetDefaultRetentionPolicyRequest(
            organizationId: organizationId
        )
        return try await self.getDefaultRetentionPolicy(input, logger: logger)
    }

    /// Gets the impersonation role details for the given WorkMail organization.
    @Sendable
    @inlinable
    public func getImpersonationRole(_ input: GetImpersonationRoleRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetImpersonationRoleResponse {
        try await self.client.execute(
            operation: "GetImpersonationRole", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets the impersonation role details for the given WorkMail organization.
    ///
    /// Parameters:
    ///   - impersonationRoleId: The impersonation role ID to retrieve.
    ///   - organizationId: The WorkMail organization from which to retrieve the impersonation role.
    ///   - logger: Logger use during operation
    @inlinable
    public func getImpersonationRole(
        impersonationRoleId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetImpersonationRoleResponse {
        let input = GetImpersonationRoleRequest(
            impersonationRoleId: impersonationRoleId, 
            organizationId: organizationId
        )
        return try await self.getImpersonationRole(input, logger: logger)
    }

    /// Tests whether the given impersonation role can impersonate a target user.
    @Sendable
    @inlinable
    public func getImpersonationRoleEffect(_ input: GetImpersonationRoleEffectRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetImpersonationRoleEffectResponse {
        try await self.client.execute(
            operation: "GetImpersonationRoleEffect", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Tests whether the given impersonation role can impersonate a target user.
    ///
    /// Parameters:
    ///   - impersonationRoleId: The impersonation role ID to test.
    ///   - organizationId: The WorkMail organization where the impersonation role is defined.
    ///   - targetUser: The WorkMail organization user chosen to test the impersonation role. The following identity formats are available:   User ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234    Email address: user@domain.tld    User name: user
    ///   - logger: Logger use during operation
    @inlinable
    public func getImpersonationRoleEffect(
        impersonationRoleId: String,
        organizationId: String,
        targetUser: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetImpersonationRoleEffectResponse {
        let input = GetImpersonationRoleEffectRequest(
            impersonationRoleId: impersonationRoleId, 
            organizationId: organizationId, 
            targetUser: targetUser
        )
        return try await self.getImpersonationRoleEffect(input, logger: logger)
    }

    /// Gets details for a mail domain, including domain records required to configure your domain with recommended security.
    @Sendable
    @inlinable
    public func getMailDomain(_ input: GetMailDomainRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetMailDomainResponse {
        try await self.client.execute(
            operation: "GetMailDomain", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets details for a mail domain, including domain records required to configure your domain with recommended security.
    ///
    /// Parameters:
    ///   - domainName: The domain from which you want to retrieve details.
    ///   - organizationId: The WorkMail organization for which the domain is retrieved.
    ///   - logger: Logger use during operation
    @inlinable
    public func getMailDomain(
        domainName: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetMailDomainResponse {
        let input = GetMailDomainRequest(
            domainName: domainName, 
            organizationId: organizationId
        )
        return try await self.getMailDomain(input, logger: logger)
    }

    /// Requests a user's mailbox details for a specified organization and user.
    @Sendable
    @inlinable
    public func getMailboxDetails(_ input: GetMailboxDetailsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetMailboxDetailsResponse {
        try await self.client.execute(
            operation: "GetMailboxDetails", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Requests a user's mailbox details for a specified organization and user.
    ///
    /// Parameters:
    ///   - organizationId: The identifier for the organization that contains the user whose mailbox details are being requested.
    ///   - userId: The identifier for the user whose mailbox details are being requested. The identifier can be the UserId, Username, or email. The following identity formats are available:   User ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: user@domain.tld   User name: user
    ///   - logger: Logger use during operation
    @inlinable
    public func getMailboxDetails(
        organizationId: String,
        userId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetMailboxDetailsResponse {
        let input = GetMailboxDetailsRequest(
            organizationId: organizationId, 
            userId: userId
        )
        return try await self.getMailboxDetails(input, logger: logger)
    }

    /// Simulates the effect of the mobile device access rules for the given attributes of a sample access event. Use this method to test the effects of the current set of mobile device access  rules for the WorkMail organization for a particular user's attributes.
    @Sendable
    @inlinable
    public func getMobileDeviceAccessEffect(_ input: GetMobileDeviceAccessEffectRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetMobileDeviceAccessEffectResponse {
        try await self.client.execute(
            operation: "GetMobileDeviceAccessEffect", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Simulates the effect of the mobile device access rules for the given attributes of a sample access event. Use this method to test the effects of the current set of mobile device access  rules for the WorkMail organization for a particular user's attributes.
    ///
    /// Parameters:
    ///   - deviceModel: Device model the simulated user will report.
    ///   - deviceOperatingSystem: Device operating system the simulated user will report.
    ///   - deviceType: Device type the simulated user will report.
    ///   - deviceUserAgent: Device user agent the simulated user will report.
    ///   - organizationId: The WorkMail organization to simulate the access effect for.
    ///   - logger: Logger use during operation
    @inlinable
    public func getMobileDeviceAccessEffect(
        deviceModel: String? = nil,
        deviceOperatingSystem: String? = nil,
        deviceType: String? = nil,
        deviceUserAgent: String? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetMobileDeviceAccessEffectResponse {
        let input = GetMobileDeviceAccessEffectRequest(
            deviceModel: deviceModel, 
            deviceOperatingSystem: deviceOperatingSystem, 
            deviceType: deviceType, 
            deviceUserAgent: deviceUserAgent, 
            organizationId: organizationId
        )
        return try await self.getMobileDeviceAccessEffect(input, logger: logger)
    }

    /// Gets the mobile device access override for the given WorkMail organization, user, and device.
    @Sendable
    @inlinable
    public func getMobileDeviceAccessOverride(_ input: GetMobileDeviceAccessOverrideRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetMobileDeviceAccessOverrideResponse {
        try await self.client.execute(
            operation: "GetMobileDeviceAccessOverride", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Gets the mobile device access override for the given WorkMail organization, user, and device.
    ///
    /// Parameters:
    ///   - deviceId: The mobile device to which the override applies. DeviceId is case insensitive.
    ///   - organizationId: The WorkMail organization to which you want to apply the override.
    ///   - userId: Identifies the WorkMail user for the override. Accepts the following types of user identities:    User ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234    Email address: user@domain.tld    User name: user
    ///   - logger: Logger use during operation
    @inlinable
    public func getMobileDeviceAccessOverride(
        deviceId: String,
        organizationId: String,
        userId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetMobileDeviceAccessOverrideResponse {
        let input = GetMobileDeviceAccessOverrideRequest(
            deviceId: deviceId, 
            organizationId: organizationId, 
            userId: userId
        )
        return try await self.getMobileDeviceAccessOverride(input, logger: logger)
    }

    ///  Requests details of a specific Personal Access Token within the WorkMail organization.
    @Sendable
    @inlinable
    public func getPersonalAccessTokenMetadata(_ input: GetPersonalAccessTokenMetadataRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> GetPersonalAccessTokenMetadataResponse {
        try await self.client.execute(
            operation: "GetPersonalAccessTokenMetadata", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Requests details of a specific Personal Access Token within the WorkMail organization.
    ///
    /// Parameters:
    ///   - organizationId:  The Organization ID.
    ///   - personalAccessTokenId:  The Personal Access Token ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func getPersonalAccessTokenMetadata(
        organizationId: String,
        personalAccessTokenId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> GetPersonalAccessTokenMetadataResponse {
        let input = GetPersonalAccessTokenMetadataRequest(
            organizationId: organizationId, 
            personalAccessTokenId: personalAccessTokenId
        )
        return try await self.getPersonalAccessTokenMetadata(input, logger: logger)
    }

    /// Lists the access control rules for the specified organization.
    @Sendable
    @inlinable
    public func listAccessControlRules(_ input: ListAccessControlRulesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAccessControlRulesResponse {
        try await self.client.execute(
            operation: "ListAccessControlRules", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the access control rules for the specified organization.
    ///
    /// Parameters:
    ///   - organizationId: The identifier for the organization.
    ///   - logger: Logger use during operation
    @inlinable
    public func listAccessControlRules(
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAccessControlRulesResponse {
        let input = ListAccessControlRulesRequest(
            organizationId: organizationId
        )
        return try await self.listAccessControlRules(input, logger: logger)
    }

    /// Creates a paginated call to list the aliases associated with a given entity.
    @Sendable
    @inlinable
    public func listAliases(_ input: ListAliasesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAliasesResponse {
        try await self.client.execute(
            operation: "ListAliases", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates a paginated call to list the aliases associated with a given entity.
    ///
    /// Parameters:
    ///   - entityId: The identifier for the entity for which to list the aliases.
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - nextToken: The token to use to retrieve the next page of results. The first call does not contain any tokens.
    ///   - organizationId: The identifier for the organization under which the entity exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func listAliases(
        entityId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAliasesResponse {
        let input = ListAliasesRequest(
            entityId: entityId, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId
        )
        return try await self.listAliases(input, logger: logger)
    }

    /// List all the AvailabilityConfiguration's for the given WorkMail organization.
    @Sendable
    @inlinable
    public func listAvailabilityConfigurations(_ input: ListAvailabilityConfigurationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListAvailabilityConfigurationsResponse {
        try await self.client.execute(
            operation: "ListAvailabilityConfigurations", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// List all the AvailabilityConfiguration's for the given WorkMail organization.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - nextToken: The token to use to retrieve the next page of results. The first call does not require a token.
    ///   - organizationId: The WorkMail organization for which the AvailabilityConfiguration's will be listed.
    ///   - logger: Logger use during operation
    @inlinable
    public func listAvailabilityConfigurations(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListAvailabilityConfigurationsResponse {
        let input = ListAvailabilityConfigurationsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId
        )
        return try await self.listAvailabilityConfigurations(input, logger: logger)
    }

    /// Returns an overview of the members of a group. Users and groups can be members of a group.
    @Sendable
    @inlinable
    public func listGroupMembers(_ input: ListGroupMembersRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListGroupMembersResponse {
        try await self.client.execute(
            operation: "ListGroupMembers", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns an overview of the members of a group. Users and groups can be members of a group.
    ///
    /// Parameters:
    ///   - groupId: The identifier for the group to which the members (users or groups) are associated. The identifier can accept GroupId, Groupname, or email. The following identity formats are available:   Group ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: group@domain.tld   Group name: group
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - nextToken:  The token to use to retrieve the next page of results. The first call does not contain any tokens.
    ///   - organizationId: The identifier for the organization under which the group exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func listGroupMembers(
        groupId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListGroupMembersResponse {
        let input = ListGroupMembersRequest(
            groupId: groupId, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId
        )
        return try await self.listGroupMembers(input, logger: logger)
    }

    /// Returns summaries of the organization's groups.
    @Sendable
    @inlinable
    public func listGroups(_ input: ListGroupsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListGroupsResponse {
        try await self.client.execute(
            operation: "ListGroups", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns summaries of the organization's groups.
    ///
    /// Parameters:
    ///   - filters: Limit the search results based on the filter criteria. Only one filter per request is supported.
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - nextToken: The token to use to retrieve the next page of results. The first call does not contain any tokens.
    ///   - organizationId: The identifier for the organization under which the groups exist.
    ///   - logger: Logger use during operation
    @inlinable
    public func listGroups(
        filters: ListGroupsFilters? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListGroupsResponse {
        let input = ListGroupsRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId
        )
        return try await self.listGroups(input, logger: logger)
    }

    /// Returns all the groups to which an entity belongs.
    @Sendable
    @inlinable
    public func listGroupsForEntity(_ input: ListGroupsForEntityRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListGroupsForEntityResponse {
        try await self.client.execute(
            operation: "ListGroupsForEntity", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns all the groups to which an entity belongs.
    ///
    /// Parameters:
    ///   - entityId: The identifier for the entity. The entity ID can accept UserId or GroupID, Username or Groupname, or email.   Entity ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: entity@domain.tld   Entity name: entity
    ///   - filters: Limit the search results based on the filter criteria.
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - nextToken: The token to use to retrieve the next page of results. The first call does not contain any tokens.
    ///   - organizationId: The identifier for the organization under which the entity exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func listGroupsForEntity(
        entityId: String,
        filters: ListGroupsForEntityFilters? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListGroupsForEntityResponse {
        let input = ListGroupsForEntityRequest(
            entityId: entityId, 
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId
        )
        return try await self.listGroupsForEntity(input, logger: logger)
    }

    /// Lists all the impersonation roles for the given WorkMail organization.
    @Sendable
    @inlinable
    public func listImpersonationRoles(_ input: ListImpersonationRolesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListImpersonationRolesResponse {
        try await self.client.execute(
            operation: "ListImpersonationRoles", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists all the impersonation roles for the given WorkMail organization.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results returned in a single call.
    ///   - nextToken: The token used to retrieve the next page of results. The first call doesn't require a token.
    ///   - organizationId: The WorkMail organization to which the listed impersonation roles belong.
    ///   - logger: Logger use during operation
    @inlinable
    public func listImpersonationRoles(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListImpersonationRolesResponse {
        let input = ListImpersonationRolesRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId
        )
        return try await self.listImpersonationRoles(input, logger: logger)
    }

    /// Lists the mail domains in a given WorkMail organization.
    @Sendable
    @inlinable
    public func listMailDomains(_ input: ListMailDomainsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListMailDomainsResponse {
        try await self.client.execute(
            operation: "ListMailDomains", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the mail domains in a given WorkMail organization.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - nextToken: The token to use to retrieve the next page of results. The first call does not require a token.
    ///   - organizationId: The WorkMail organization for which to list domains.
    ///   - logger: Logger use during operation
    @inlinable
    public func listMailDomains(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListMailDomainsResponse {
        let input = ListMailDomainsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId
        )
        return try await self.listMailDomains(input, logger: logger)
    }

    /// Lists the mailbox export jobs started for the specified organization within the last seven days.
    @Sendable
    @inlinable
    public func listMailboxExportJobs(_ input: ListMailboxExportJobsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListMailboxExportJobsResponse {
        try await self.client.execute(
            operation: "ListMailboxExportJobs", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the mailbox export jobs started for the specified organization within the last seven days.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - nextToken: The token to use to retrieve the next page of results.
    ///   - organizationId: The organization ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func listMailboxExportJobs(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListMailboxExportJobsResponse {
        let input = ListMailboxExportJobsRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId
        )
        return try await self.listMailboxExportJobs(input, logger: logger)
    }

    /// Lists the mailbox permissions associated with a user, group, or resource mailbox.
    @Sendable
    @inlinable
    public func listMailboxPermissions(_ input: ListMailboxPermissionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListMailboxPermissionsResponse {
        try await self.client.execute(
            operation: "ListMailboxPermissions", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the mailbox permissions associated with a user, group, or resource mailbox.
    ///
    /// Parameters:
    ///   - entityId: The identifier of the user, or resource for which to list mailbox permissions. The entity ID can accept UserId or ResourceId, Username or Resourcename, or email.   Entity ID: 12345678-1234-1234-1234-123456789012, or r-0123456789a0123456789b0123456789   Email address: entity@domain.tld   Entity name: entity
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - nextToken: The token to use to retrieve the next page of results. The first call does not contain any tokens.
    ///   - organizationId: The identifier of the organization under which the user, group, or resource exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func listMailboxPermissions(
        entityId: String,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListMailboxPermissionsResponse {
        let input = ListMailboxPermissionsRequest(
            entityId: entityId, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId
        )
        return try await self.listMailboxPermissions(input, logger: logger)
    }

    /// Lists all the mobile device access overrides for any given combination of WorkMail organization, user, or device.
    @Sendable
    @inlinable
    public func listMobileDeviceAccessOverrides(_ input: ListMobileDeviceAccessOverridesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListMobileDeviceAccessOverridesResponse {
        try await self.client.execute(
            operation: "ListMobileDeviceAccessOverrides", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists all the mobile device access overrides for any given combination of WorkMail organization, user, or device.
    ///
    /// Parameters:
    ///   - deviceId: The mobile device to which the access override applies.
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - nextToken: The token to use to retrieve the next page of results. The first call does not require a token.
    ///   - organizationId: The WorkMail organization under which to list mobile device access overrides.
    ///   - userId: The WorkMail user under which you list the mobile device access overrides. Accepts the following types of user identities:   User ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234    Email address: user@domain.tld    User name: user
    ///   - logger: Logger use during operation
    @inlinable
    public func listMobileDeviceAccessOverrides(
        deviceId: String? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        userId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListMobileDeviceAccessOverridesResponse {
        let input = ListMobileDeviceAccessOverridesRequest(
            deviceId: deviceId, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId, 
            userId: userId
        )
        return try await self.listMobileDeviceAccessOverrides(input, logger: logger)
    }

    /// Lists the mobile device access rules for the specified WorkMail organization.
    @Sendable
    @inlinable
    public func listMobileDeviceAccessRules(_ input: ListMobileDeviceAccessRulesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListMobileDeviceAccessRulesResponse {
        try await self.client.execute(
            operation: "ListMobileDeviceAccessRules", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the mobile device access rules for the specified WorkMail organization.
    ///
    /// Parameters:
    ///   - organizationId: The WorkMail organization for which to list the rules.
    ///   - logger: Logger use during operation
    @inlinable
    public func listMobileDeviceAccessRules(
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListMobileDeviceAccessRulesResponse {
        let input = ListMobileDeviceAccessRulesRequest(
            organizationId: organizationId
        )
        return try await self.listMobileDeviceAccessRules(input, logger: logger)
    }

    /// Returns summaries of the customer's organizations.
    @Sendable
    @inlinable
    public func listOrganizations(_ input: ListOrganizationsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListOrganizationsResponse {
        try await self.client.execute(
            operation: "ListOrganizations", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns summaries of the customer's organizations.
    ///
    /// Parameters:
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - nextToken: The token to use to retrieve the next page of results. The first call does not contain any tokens.
    ///   - logger: Logger use during operation
    @inlinable
    public func listOrganizations(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListOrganizationsResponse {
        let input = ListOrganizationsRequest(
            maxResults: maxResults, 
            nextToken: nextToken
        )
        return try await self.listOrganizations(input, logger: logger)
    }

    ///  Returns a summary of your Personal Access Tokens.
    @Sendable
    @inlinable
    public func listPersonalAccessTokens(_ input: ListPersonalAccessTokensRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListPersonalAccessTokensResponse {
        try await self.client.execute(
            operation: "ListPersonalAccessTokens", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Returns a summary of your Personal Access Tokens.
    ///
    /// Parameters:
    ///   - maxResults:  The maximum amount of items that should be returned in a response.
    ///   - nextToken:  The token from the previous response to query the next page.
    ///   - organizationId:  The Organization ID.
    ///   - userId:  The WorkMail User ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func listPersonalAccessTokens(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        userId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListPersonalAccessTokensResponse {
        let input = ListPersonalAccessTokensRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId, 
            userId: userId
        )
        return try await self.listPersonalAccessTokens(input, logger: logger)
    }

    /// Lists the delegates associated with a resource. Users and groups can be resource delegates and answer requests on behalf of the resource.
    @Sendable
    @inlinable
    public func listResourceDelegates(_ input: ListResourceDelegatesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListResourceDelegatesResponse {
        try await self.client.execute(
            operation: "ListResourceDelegates", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the delegates associated with a resource. Users and groups can be resource delegates and answer requests on behalf of the resource.
    ///
    /// Parameters:
    ///   - maxResults: The number of maximum results in a page.
    ///   - nextToken: The token used to paginate through the delegates associated with a resource.
    ///   - organizationId: The identifier for the organization that contains the resource for which delegates are listed.
    ///   - resourceId: The identifier for the resource whose delegates are listed. The identifier can accept ResourceId, Resourcename, or email. The following identity formats are available:   Resource ID: r-0123456789a0123456789b0123456789   Email address: resource@domain.tld   Resource name: resource
    ///   - logger: Logger use during operation
    @inlinable
    public func listResourceDelegates(
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        resourceId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListResourceDelegatesResponse {
        let input = ListResourceDelegatesRequest(
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId, 
            resourceId: resourceId
        )
        return try await self.listResourceDelegates(input, logger: logger)
    }

    /// Returns summaries of the organization's resources.
    @Sendable
    @inlinable
    public func listResources(_ input: ListResourcesRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListResourcesResponse {
        try await self.client.execute(
            operation: "ListResources", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns summaries of the organization's resources.
    ///
    /// Parameters:
    ///   - filters: Limit the resource search results based on the filter criteria. You can only use one filter per request.
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - nextToken: The token to use to retrieve the next page of results. The first call does not contain any tokens.
    ///   - organizationId: The identifier for the organization under which the resources exist.
    ///   - logger: Logger use during operation
    @inlinable
    public func listResources(
        filters: ListResourcesFilters? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListResourcesResponse {
        let input = ListResourcesRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId
        )
        return try await self.listResources(input, logger: logger)
    }

    /// Lists the tags applied to an WorkMail organization resource.
    @Sendable
    @inlinable
    public func listTagsForResource(_ input: ListTagsForResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListTagsForResourceResponse {
        try await self.client.execute(
            operation: "ListTagsForResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Lists the tags applied to an WorkMail organization resource.
    ///
    /// Parameters:
    ///   - resourceARN: The resource ARN.
    ///   - logger: Logger use during operation
    @inlinable
    public func listTagsForResource(
        resourceARN: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListTagsForResourceResponse {
        let input = ListTagsForResourceRequest(
            resourceARN: resourceARN
        )
        return try await self.listTagsForResource(input, logger: logger)
    }

    /// Returns summaries of the organization's users.
    @Sendable
    @inlinable
    public func listUsers(_ input: ListUsersRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ListUsersResponse {
        try await self.client.execute(
            operation: "ListUsers", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Returns summaries of the organization's users.
    ///
    /// Parameters:
    ///   - filters: Limit the user search results based on the filter criteria. You can only use one filter per request.
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - nextToken: The token to use to retrieve the next page of results. The first call does not contain any tokens.
    ///   - organizationId: The identifier for the organization under which the users exist.
    ///   - logger: Logger use during operation
    @inlinable
    public func listUsers(
        filters: ListUsersFilters? = nil,
        maxResults: Int? = nil,
        nextToken: String? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ListUsersResponse {
        let input = ListUsersRequest(
            filters: filters, 
            maxResults: maxResults, 
            nextToken: nextToken, 
            organizationId: organizationId
        )
        return try await self.listUsers(input, logger: logger)
    }

    /// Adds a new access control rule for the specified organization. The rule allows or denies access to the organization for the specified IPv4 addresses, access protocol actions, user IDs and impersonation IDs. Adding a new rule with the same name as an existing rule replaces the older rule.
    @Sendable
    @inlinable
    public func putAccessControlRule(_ input: PutAccessControlRuleRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutAccessControlRuleResponse {
        try await self.client.execute(
            operation: "PutAccessControlRule", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Adds a new access control rule for the specified organization. The rule allows or denies access to the organization for the specified IPv4 addresses, access protocol actions, user IDs and impersonation IDs. Adding a new rule with the same name as an existing rule replaces the older rule.
    ///
    /// Parameters:
    ///   - actions: Access protocol actions to include in the rule. Valid values include ActiveSync, AutoDiscover, EWS, IMAP, SMTP, WindowsOutlook, and WebMail.
    ///   - description: The rule description.
    ///   - effect: The rule effect.
    ///   - impersonationRoleIds: Impersonation role IDs to include in the rule.
    ///   - ipRanges: IPv4 CIDR ranges to include in the rule.
    ///   - name: The rule name.
    ///   - notActions: Access protocol actions to exclude from the rule. Valid values include ActiveSync, AutoDiscover, EWS, IMAP, SMTP, WindowsOutlook, and WebMail.
    ///   - notImpersonationRoleIds: Impersonation role IDs to exclude from the rule.
    ///   - notIpRanges: IPv4 CIDR ranges to exclude from the rule.
    ///   - notUserIds: User IDs to exclude from the rule.
    ///   - organizationId: The identifier of the organization.
    ///   - userIds: User IDs to include in the rule.
    ///   - logger: Logger use during operation
    @inlinable
    public func putAccessControlRule(
        actions: [String]? = nil,
        description: String,
        effect: AccessControlRuleEffect,
        impersonationRoleIds: [String]? = nil,
        ipRanges: [String]? = nil,
        name: String,
        notActions: [String]? = nil,
        notImpersonationRoleIds: [String]? = nil,
        notIpRanges: [String]? = nil,
        notUserIds: [String]? = nil,
        organizationId: String,
        userIds: [String]? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutAccessControlRuleResponse {
        let input = PutAccessControlRuleRequest(
            actions: actions, 
            description: description, 
            effect: effect, 
            impersonationRoleIds: impersonationRoleIds, 
            ipRanges: ipRanges, 
            name: name, 
            notActions: notActions, 
            notImpersonationRoleIds: notImpersonationRoleIds, 
            notIpRanges: notIpRanges, 
            notUserIds: notUserIds, 
            organizationId: organizationId, 
            userIds: userIds
        )
        return try await self.putAccessControlRule(input, logger: logger)
    }

    /// Creates or updates the email monitoring configuration for a specified organization.
    @Sendable
    @inlinable
    public func putEmailMonitoringConfiguration(_ input: PutEmailMonitoringConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutEmailMonitoringConfigurationResponse {
        try await self.client.execute(
            operation: "PutEmailMonitoringConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates or updates the email monitoring configuration for a specified organization.
    ///
    /// Parameters:
    ///   - logGroupArn: The Amazon Resource Name (ARN) of the CloudWatch Log group associated with the email monitoring configuration.
    ///   - organizationId: The ID of the organization for which the email monitoring configuration is set.
    ///   - roleArn: The Amazon Resource Name (ARN) of the IAM Role associated with the email monitoring configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func putEmailMonitoringConfiguration(
        logGroupArn: String,
        organizationId: String,
        roleArn: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutEmailMonitoringConfigurationResponse {
        let input = PutEmailMonitoringConfigurationRequest(
            logGroupArn: logGroupArn, 
            organizationId: organizationId, 
            roleArn: roleArn
        )
        return try await self.putEmailMonitoringConfiguration(input, logger: logger)
    }

    ///  Enables integration between IAM Identity Center (IdC) and WorkMail to proxy authentication requests for mailbox users. You can connect your IdC directory or your external directory to WorkMail through  IdC and manage access to WorkMail mailboxes in a single place. For enhanced protection, you could enable Multifactor Authentication (MFA) and Personal Access Tokens.
    @Sendable
    @inlinable
    public func putIdentityProviderConfiguration(_ input: PutIdentityProviderConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutIdentityProviderConfigurationResponse {
        try await self.client.execute(
            operation: "PutIdentityProviderConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    ///  Enables integration between IAM Identity Center (IdC) and WorkMail to proxy authentication requests for mailbox users. You can connect your IdC directory or your external directory to WorkMail through  IdC and manage access to WorkMail mailboxes in a single place. For enhanced protection, you could enable Multifactor Authentication (MFA) and Personal Access Tokens.
    ///
    /// Parameters:
    ///   - authenticationMode:  The authentication mode used in WorkMail.
    ///   - identityCenterConfiguration:  The details of the IAM Identity Center configuration.
    ///   - organizationId:  The ID of the WorkMail Organization.
    ///   - personalAccessTokenConfiguration:  The details of the Personal Access Token configuration.
    ///   - logger: Logger use during operation
    @inlinable
    public func putIdentityProviderConfiguration(
        authenticationMode: IdentityProviderAuthenticationMode,
        identityCenterConfiguration: IdentityCenterConfiguration,
        organizationId: String,
        personalAccessTokenConfiguration: PersonalAccessTokenConfiguration,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutIdentityProviderConfigurationResponse {
        let input = PutIdentityProviderConfigurationRequest(
            authenticationMode: authenticationMode, 
            identityCenterConfiguration: identityCenterConfiguration, 
            organizationId: organizationId, 
            personalAccessTokenConfiguration: personalAccessTokenConfiguration
        )
        return try await self.putIdentityProviderConfiguration(input, logger: logger)
    }

    /// Enables or disables a DMARC policy for a given organization.
    @Sendable
    @inlinable
    public func putInboundDmarcSettings(_ input: PutInboundDmarcSettingsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutInboundDmarcSettingsResponse {
        try await self.client.execute(
            operation: "PutInboundDmarcSettings", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Enables or disables a DMARC policy for a given organization.
    ///
    /// Parameters:
    ///   - enforced: Enforces or suspends a policy after it's applied.
    ///   - organizationId: The ID of the organization that you are applying the DMARC policy to.
    ///   - logger: Logger use during operation
    @inlinable
    public func putInboundDmarcSettings(
        enforced: Bool,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutInboundDmarcSettingsResponse {
        let input = PutInboundDmarcSettingsRequest(
            enforced: enforced, 
            organizationId: organizationId
        )
        return try await self.putInboundDmarcSettings(input, logger: logger)
    }

    /// Sets permissions for a user, group, or resource. This replaces any pre-existing permissions.
    @Sendable
    @inlinable
    public func putMailboxPermissions(_ input: PutMailboxPermissionsRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutMailboxPermissionsResponse {
        try await self.client.execute(
            operation: "PutMailboxPermissions", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Sets permissions for a user, group, or resource. This replaces any pre-existing permissions.
    ///
    /// Parameters:
    ///   - entityId: The identifier of the user or resource for which to update mailbox permissions. The identifier can be UserId, ResourceID, or Group Id, Username, Resourcename, or Groupname, or email.   Entity ID: 12345678-1234-1234-1234-123456789012, r-0123456789a0123456789b0123456789, or S-1-1-12-1234567890-123456789-123456789-1234   Email address: entity@domain.tld   Entity name: entity
    ///   - granteeId: The identifier of the user, group, or resource to which to grant the permissions. The identifier can be UserId, ResourceID, or Group Id, Username, Resourcename, or Groupname, or email.   Grantee ID: 12345678-1234-1234-1234-123456789012, r-0123456789a0123456789b0123456789, or S-1-1-12-1234567890-123456789-123456789-1234   Email address: grantee@domain.tld   Grantee name: grantee
    ///   - organizationId: The identifier of the organization under which the user, group, or resource exists.
    ///   - permissionValues: The permissions granted to the grantee. SEND_AS allows the grantee to send email as the owner of the mailbox (the grantee is not mentioned on these emails). SEND_ON_BEHALF allows the grantee to send email on behalf of the owner of the mailbox (the grantee is not mentioned as the physical sender of these emails). FULL_ACCESS allows the grantee full access to the mailbox, irrespective of other folder-level permissions set on the mailbox.
    ///   - logger: Logger use during operation
    @inlinable
    public func putMailboxPermissions(
        entityId: String,
        granteeId: String,
        organizationId: String,
        permissionValues: [PermissionType],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutMailboxPermissionsResponse {
        let input = PutMailboxPermissionsRequest(
            entityId: entityId, 
            granteeId: granteeId, 
            organizationId: organizationId, 
            permissionValues: permissionValues
        )
        return try await self.putMailboxPermissions(input, logger: logger)
    }

    /// Creates or updates a mobile device access override for the given WorkMail organization, user, and device.
    @Sendable
    @inlinable
    public func putMobileDeviceAccessOverride(_ input: PutMobileDeviceAccessOverrideRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutMobileDeviceAccessOverrideResponse {
        try await self.client.execute(
            operation: "PutMobileDeviceAccessOverride", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Creates or updates a mobile device access override for the given WorkMail organization, user, and device.
    ///
    /// Parameters:
    ///   - description: A description of the override.
    ///   - deviceId: The mobile device for which you create the override. DeviceId is case insensitive.
    ///   - effect: The effect of the override, ALLOW or DENY.
    ///   - organizationId: Identifies the WorkMail organization for which you create the override.
    ///   - userId: The WorkMail user for which you create the override. Accepts the following types of user identities:   User ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234    Email address: user@domain.tld    User name: user
    ///   - logger: Logger use during operation
    @inlinable
    public func putMobileDeviceAccessOverride(
        description: String? = nil,
        deviceId: String,
        effect: MobileDeviceAccessRuleEffect,
        organizationId: String,
        userId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutMobileDeviceAccessOverrideResponse {
        let input = PutMobileDeviceAccessOverrideRequest(
            description: description, 
            deviceId: deviceId, 
            effect: effect, 
            organizationId: organizationId, 
            userId: userId
        )
        return try await self.putMobileDeviceAccessOverride(input, logger: logger)
    }

    /// Puts a retention policy to the specified organization.
    @Sendable
    @inlinable
    public func putRetentionPolicy(_ input: PutRetentionPolicyRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> PutRetentionPolicyResponse {
        try await self.client.execute(
            operation: "PutRetentionPolicy", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Puts a retention policy to the specified organization.
    ///
    /// Parameters:
    ///   - description: The retention policy description.
    ///   - folderConfigurations: The retention policy folder configurations.
    ///   - id: The retention policy ID.
    ///   - name: The retention policy name.
    ///   - organizationId: The organization ID.
    ///   - logger: Logger use during operation
    @inlinable
    public func putRetentionPolicy(
        description: String? = nil,
        folderConfigurations: [FolderConfiguration],
        id: String? = nil,
        name: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> PutRetentionPolicyResponse {
        let input = PutRetentionPolicyRequest(
            description: description, 
            folderConfigurations: folderConfigurations, 
            id: id, 
            name: name, 
            organizationId: organizationId
        )
        return try await self.putRetentionPolicy(input, logger: logger)
    }

    /// Registers a new domain in WorkMail and SES, and configures it for use by WorkMail. Emails received by SES for this domain are routed to the specified WorkMail organization, and WorkMail has  permanent permission to use the specified domain for sending your users' emails.
    @Sendable
    @inlinable
    public func registerMailDomain(_ input: RegisterMailDomainRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> RegisterMailDomainResponse {
        try await self.client.execute(
            operation: "RegisterMailDomain", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Registers a new domain in WorkMail and SES, and configures it for use by WorkMail. Emails received by SES for this domain are routed to the specified WorkMail organization, and WorkMail has  permanent permission to use the specified domain for sending your users' emails.
    ///
    /// Parameters:
    ///   - clientToken: Idempotency token used when retrying requests.
    ///   - domainName: The name of the mail domain to create in WorkMail and SES.
    ///   - organizationId: The WorkMail organization under which you're creating the domain.
    ///   - logger: Logger use during operation
    @inlinable
    public func registerMailDomain(
        clientToken: String? = RegisterMailDomainRequest.idempotencyToken(),
        domainName: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> RegisterMailDomainResponse {
        let input = RegisterMailDomainRequest(
            clientToken: clientToken, 
            domainName: domainName, 
            organizationId: organizationId
        )
        return try await self.registerMailDomain(input, logger: logger)
    }

    /// Registers an existing and disabled user, group, or resource for WorkMail use by associating a mailbox and calendaring capabilities. It performs no change if the user, group, or resource is enabled and fails if the user, group, or resource is deleted. This operation results in the accumulation of costs. For more information, see Pricing. The equivalent console functionality for this operation is Enable. Users can either be created by calling the CreateUser API operation or they can be synchronized from your directory. For more information, see DeregisterFromWorkMail.
    @Sendable
    @inlinable
    public func registerToWorkMail(_ input: RegisterToWorkMailRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> RegisterToWorkMailResponse {
        try await self.client.execute(
            operation: "RegisterToWorkMail", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Registers an existing and disabled user, group, or resource for WorkMail use by associating a mailbox and calendaring capabilities. It performs no change if the user, group, or resource is enabled and fails if the user, group, or resource is deleted. This operation results in the accumulation of costs. For more information, see Pricing. The equivalent console functionality for this operation is Enable. Users can either be created by calling the CreateUser API operation or they can be synchronized from your directory. For more information, see DeregisterFromWorkMail.
    ///
    /// Parameters:
    ///   - email: The email for the user, group, or resource to be updated.
    ///   - entityId: The identifier for the user, group, or resource to be updated. The identifier can accept UserId, ResourceId, or GroupId, or Username, Resourcename, or Groupname. The following identity formats are available:   Entity ID: 12345678-1234-1234-1234-123456789012, r-0123456789a0123456789b0123456789, or S-1-1-12-1234567890-123456789-123456789-1234   Entity name: entity
    ///   - organizationId: The identifier for the organization under which the user, group, or resource exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func registerToWorkMail(
        email: String,
        entityId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> RegisterToWorkMailResponse {
        let input = RegisterToWorkMailRequest(
            email: email, 
            entityId: entityId, 
            organizationId: organizationId
        )
        return try await self.registerToWorkMail(input, logger: logger)
    }

    /// Allows the administrator to reset the password for a user.
    @Sendable
    @inlinable
    public func resetPassword(_ input: ResetPasswordRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> ResetPasswordResponse {
        try await self.client.execute(
            operation: "ResetPassword", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Allows the administrator to reset the password for a user.
    ///
    /// Parameters:
    ///   - organizationId: The identifier of the organization that contains the user for which the password is reset.
    ///   - password: The new password for the user.
    ///   - userId: The identifier of the user for whom the password is reset.
    ///   - logger: Logger use during operation
    @inlinable
    public func resetPassword(
        organizationId: String,
        password: String,
        userId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> ResetPasswordResponse {
        let input = ResetPasswordRequest(
            organizationId: organizationId, 
            password: password, 
            userId: userId
        )
        return try await self.resetPassword(input, logger: logger)
    }

    /// Starts a mailbox export job to export MIME-format email messages and calendar items from the specified mailbox to the specified Amazon Simple Storage Service (Amazon S3) bucket. For more information, see Exporting mailbox content in the WorkMail Administrator Guide.
    @Sendable
    @inlinable
    public func startMailboxExportJob(_ input: StartMailboxExportJobRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> StartMailboxExportJobResponse {
        try await self.client.execute(
            operation: "StartMailboxExportJob", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Starts a mailbox export job to export MIME-format email messages and calendar items from the specified mailbox to the specified Amazon Simple Storage Service (Amazon S3) bucket. For more information, see Exporting mailbox content in the WorkMail Administrator Guide.
    ///
    /// Parameters:
    ///   - clientToken: The idempotency token for the client request.
    ///   - description: The mailbox export job description.
    ///   - entityId: The identifier of the user or resource associated with the mailbox. The identifier can accept UserId or ResourceId, Username or Resourcename, or email. The following identity formats are available:   Entity ID: 12345678-1234-1234-1234-123456789012, r-0123456789a0123456789b0123456789 , or S-1-1-12-1234567890-123456789-123456789-1234   Email address: entity@domain.tld   Entity name: entity
    ///   - kmsKeyArn: The Amazon Resource Name (ARN) of the symmetric AWS Key Management Service (AWS KMS) key that encrypts the exported mailbox content.
    ///   - organizationId: The identifier associated with the organization.
    ///   - roleArn: The ARN of the AWS Identity and Access Management (IAM) role that grants write permission to the S3 bucket.
    ///   - s3BucketName: The name of the S3 bucket.
    ///   - s3Prefix: The S3 bucket prefix.
    ///   - logger: Logger use during operation
    @inlinable
    public func startMailboxExportJob(
        clientToken: String = StartMailboxExportJobRequest.idempotencyToken(),
        description: String? = nil,
        entityId: String,
        kmsKeyArn: String,
        organizationId: String,
        roleArn: String,
        s3BucketName: String,
        s3Prefix: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> StartMailboxExportJobResponse {
        let input = StartMailboxExportJobRequest(
            clientToken: clientToken, 
            description: description, 
            entityId: entityId, 
            kmsKeyArn: kmsKeyArn, 
            organizationId: organizationId, 
            roleArn: roleArn, 
            s3BucketName: s3BucketName, 
            s3Prefix: s3Prefix
        )
        return try await self.startMailboxExportJob(input, logger: logger)
    }

    /// Applies the specified tags to the specified WorkMailorganization resource.
    @Sendable
    @inlinable
    public func tagResource(_ input: TagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TagResourceResponse {
        try await self.client.execute(
            operation: "TagResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Applies the specified tags to the specified WorkMailorganization resource.
    ///
    /// Parameters:
    ///   - resourceARN: The resource ARN.
    ///   - tags: The tag key-value pairs.
    ///   - logger: Logger use during operation
    @inlinable
    public func tagResource(
        resourceARN: String,
        tags: [Tag],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TagResourceResponse {
        let input = TagResourceRequest(
            resourceARN: resourceARN, 
            tags: tags
        )
        return try await self.tagResource(input, logger: logger)
    }

    /// Performs a test on an availability provider to ensure that access is allowed. For EWS, it verifies the provided credentials can be used to successfully log in. For Lambda, it verifies that the Lambda function can be invoked and that the resource access policy was configured to deny anonymous access. An anonymous invocation is one done without providing either a SourceArn or SourceAccount header.  The request must contain either one provider definition (EwsProvider or LambdaProvider) or the DomainName parameter. If the DomainName parameter is provided, the configuration stored under the DomainName will be tested.
    @Sendable
    @inlinable
    public func testAvailabilityConfiguration(_ input: TestAvailabilityConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> TestAvailabilityConfigurationResponse {
        try await self.client.execute(
            operation: "TestAvailabilityConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Performs a test on an availability provider to ensure that access is allowed. For EWS, it verifies the provided credentials can be used to successfully log in. For Lambda, it verifies that the Lambda function can be invoked and that the resource access policy was configured to deny anonymous access. An anonymous invocation is one done without providing either a SourceArn or SourceAccount header.  The request must contain either one provider definition (EwsProvider or LambdaProvider) or the DomainName parameter. If the DomainName parameter is provided, the configuration stored under the DomainName will be tested.
    ///
    /// Parameters:
    ///   - domainName: The domain to which the provider applies. If this field is provided, a stored availability provider associated to this domain name will be tested.
    ///   - ewsProvider: 
    ///   - lambdaProvider: 
    ///   - organizationId: The WorkMail organization where the availability provider will be tested.
    ///   - logger: Logger use during operation
    @inlinable
    public func testAvailabilityConfiguration(
        domainName: String? = nil,
        ewsProvider: EwsAvailabilityProvider? = nil,
        lambdaProvider: LambdaAvailabilityProvider? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> TestAvailabilityConfigurationResponse {
        let input = TestAvailabilityConfigurationRequest(
            domainName: domainName, 
            ewsProvider: ewsProvider, 
            lambdaProvider: lambdaProvider, 
            organizationId: organizationId
        )
        return try await self.testAvailabilityConfiguration(input, logger: logger)
    }

    /// Untags the specified tags from the specified WorkMail organization resource.
    @Sendable
    @inlinable
    public func untagResource(_ input: UntagResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UntagResourceResponse {
        try await self.client.execute(
            operation: "UntagResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Untags the specified tags from the specified WorkMail organization resource.
    ///
    /// Parameters:
    ///   - resourceARN: The resource ARN.
    ///   - tagKeys: The tag keys.
    ///   - logger: Logger use during operation
    @inlinable
    public func untagResource(
        resourceARN: String,
        tagKeys: [String],
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UntagResourceResponse {
        let input = UntagResourceRequest(
            resourceARN: resourceARN, 
            tagKeys: tagKeys
        )
        return try await self.untagResource(input, logger: logger)
    }

    /// Updates an existing AvailabilityConfiguration for the given WorkMail organization and domain.
    @Sendable
    @inlinable
    public func updateAvailabilityConfiguration(_ input: UpdateAvailabilityConfigurationRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateAvailabilityConfigurationResponse {
        try await self.client.execute(
            operation: "UpdateAvailabilityConfiguration", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates an existing AvailabilityConfiguration for the given WorkMail organization and domain.
    ///
    /// Parameters:
    ///   - domainName: The domain to which the provider applies the availability configuration.
    ///   - ewsProvider: The EWS availability provider definition. The request must contain exactly one provider definition, either EwsProvider or LambdaProvider. The previously stored provider will be overridden by the one provided.
    ///   - lambdaProvider: The Lambda availability provider definition. The request must contain exactly one provider definition, either EwsProvider or LambdaProvider. The previously stored provider will be overridden by the one provided.
    ///   - organizationId: The WorkMail organization for which the AvailabilityConfiguration will be updated.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateAvailabilityConfiguration(
        domainName: String,
        ewsProvider: EwsAvailabilityProvider? = nil,
        lambdaProvider: LambdaAvailabilityProvider? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateAvailabilityConfigurationResponse {
        let input = UpdateAvailabilityConfigurationRequest(
            domainName: domainName, 
            ewsProvider: ewsProvider, 
            lambdaProvider: lambdaProvider, 
            organizationId: organizationId
        )
        return try await self.updateAvailabilityConfiguration(input, logger: logger)
    }

    /// Updates the default mail domain for an organization. The default mail domain is used by the WorkMail AWS Console to suggest an email address when enabling a mail user. You can only have one default domain.
    @Sendable
    @inlinable
    public func updateDefaultMailDomain(_ input: UpdateDefaultMailDomainRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateDefaultMailDomainResponse {
        try await self.client.execute(
            operation: "UpdateDefaultMailDomain", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the default mail domain for an organization. The default mail domain is used by the WorkMail AWS Console to suggest an email address when enabling a mail user. You can only have one default domain.
    ///
    /// Parameters:
    ///   - domainName: The domain name that will become the default domain.
    ///   - organizationId: The WorkMail organization for which to list domains.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateDefaultMailDomain(
        domainName: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateDefaultMailDomainResponse {
        let input = UpdateDefaultMailDomainRequest(
            domainName: domainName, 
            organizationId: organizationId
        )
        return try await self.updateDefaultMailDomain(input, logger: logger)
    }

    /// Updates attributes in a group.
    @Sendable
    @inlinable
    public func updateGroup(_ input: UpdateGroupRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateGroupResponse {
        try await self.client.execute(
            operation: "UpdateGroup", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates attributes in a group.
    ///
    /// Parameters:
    ///   - groupId: The identifier for the group to be updated. The identifier can accept GroupId, Groupname, or email. The following identity formats are available:   Group ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: group@domain.tld   Group name: group
    ///   - hiddenFromGlobalAddressList: If enabled, the group is hidden from the global address list.
    ///   - organizationId: The identifier for the organization under which the group exists.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateGroup(
        groupId: String,
        hiddenFromGlobalAddressList: Bool? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateGroupResponse {
        let input = UpdateGroupRequest(
            groupId: groupId, 
            hiddenFromGlobalAddressList: hiddenFromGlobalAddressList, 
            organizationId: organizationId
        )
        return try await self.updateGroup(input, logger: logger)
    }

    /// Updates an impersonation role for the given WorkMail organization.
    @Sendable
    @inlinable
    public func updateImpersonationRole(_ input: UpdateImpersonationRoleRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateImpersonationRoleResponse {
        try await self.client.execute(
            operation: "UpdateImpersonationRole", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates an impersonation role for the given WorkMail organization.
    ///
    /// Parameters:
    ///   - description: The updated impersonation role description.
    ///   - impersonationRoleId: The ID of the impersonation role to update.
    ///   - name: The updated impersonation role name.
    ///   - organizationId: The WorkMail organization that contains the impersonation role to update.
    ///   - rules: The updated list of rules.
    ///   - type: The updated impersonation role type.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateImpersonationRole(
        description: String? = nil,
        impersonationRoleId: String,
        name: String,
        organizationId: String,
        rules: [ImpersonationRule],
        type: ImpersonationRoleType,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateImpersonationRoleResponse {
        let input = UpdateImpersonationRoleRequest(
            description: description, 
            impersonationRoleId: impersonationRoleId, 
            name: name, 
            organizationId: organizationId, 
            rules: rules, 
            type: type
        )
        return try await self.updateImpersonationRole(input, logger: logger)
    }

    /// Updates a user's current mailbox quota for a specified organization and user.
    @Sendable
    @inlinable
    public func updateMailboxQuota(_ input: UpdateMailboxQuotaRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateMailboxQuotaResponse {
        try await self.client.execute(
            operation: "UpdateMailboxQuota", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a user's current mailbox quota for a specified organization and user.
    ///
    /// Parameters:
    ///   - mailboxQuota: The updated mailbox quota, in MB, for the specified user.
    ///   - organizationId: The identifier for the organization that contains the user for whom to update the mailbox quota.
    ///   - userId: The identifer for the user for whom to update the mailbox quota. The identifier can be the UserId, Username, or email. The following identity formats are available:   User ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: user@domain.tld   User name: user
    ///   - logger: Logger use during operation
    @inlinable
    public func updateMailboxQuota(
        mailboxQuota: Int,
        organizationId: String,
        userId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateMailboxQuotaResponse {
        let input = UpdateMailboxQuotaRequest(
            mailboxQuota: mailboxQuota, 
            organizationId: organizationId, 
            userId: userId
        )
        return try await self.updateMailboxQuota(input, logger: logger)
    }

    /// Updates a mobile device access rule for the specified WorkMail organization.
    @Sendable
    @inlinable
    public func updateMobileDeviceAccessRule(_ input: UpdateMobileDeviceAccessRuleRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateMobileDeviceAccessRuleResponse {
        try await self.client.execute(
            operation: "UpdateMobileDeviceAccessRule", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates a mobile device access rule for the specified WorkMail organization.
    ///
    /// Parameters:
    ///   - description: The updated rule description.
    ///   - deviceModels: Device models that the updated rule will match.
    ///   - deviceOperatingSystems: Device operating systems that the updated rule will match.
    ///   - deviceTypes: Device types that the updated rule will match.
    ///   - deviceUserAgents: User agents that the updated rule will match.
    ///   - effect: The effect of the rule when it matches. Allowed values are ALLOW or DENY.
    ///   - mobileDeviceAccessRuleId: The identifier of the rule to be updated.
    ///   - name: The updated rule name.
    ///   - notDeviceModels: Device models that the updated rule will not match. All other device models will match.
    ///   - notDeviceOperatingSystems: Device operating systems that the updated rule will not match. All other device operating systems will match.
    ///   - notDeviceTypes: Device types that the updated rule will not match. All other device types will match.
    ///   - notDeviceUserAgents: User agents that the updated rule will not match. All other user agents will match.
    ///   - organizationId: The WorkMail organization under which the rule will be updated.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateMobileDeviceAccessRule(
        description: String? = nil,
        deviceModels: [String]? = nil,
        deviceOperatingSystems: [String]? = nil,
        deviceTypes: [String]? = nil,
        deviceUserAgents: [String]? = nil,
        effect: MobileDeviceAccessRuleEffect,
        mobileDeviceAccessRuleId: String,
        name: String,
        notDeviceModels: [String]? = nil,
        notDeviceOperatingSystems: [String]? = nil,
        notDeviceTypes: [String]? = nil,
        notDeviceUserAgents: [String]? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateMobileDeviceAccessRuleResponse {
        let input = UpdateMobileDeviceAccessRuleRequest(
            description: description, 
            deviceModels: deviceModels, 
            deviceOperatingSystems: deviceOperatingSystems, 
            deviceTypes: deviceTypes, 
            deviceUserAgents: deviceUserAgents, 
            effect: effect, 
            mobileDeviceAccessRuleId: mobileDeviceAccessRuleId, 
            name: name, 
            notDeviceModels: notDeviceModels, 
            notDeviceOperatingSystems: notDeviceOperatingSystems, 
            notDeviceTypes: notDeviceTypes, 
            notDeviceUserAgents: notDeviceUserAgents, 
            organizationId: organizationId
        )
        return try await self.updateMobileDeviceAccessRule(input, logger: logger)
    }

    /// Updates the primary email for a user, group, or resource. The current email is moved into the list of aliases (or swapped between an existing alias and the current primary email), and the email provided in the input is promoted as the primary.
    @Sendable
    @inlinable
    public func updatePrimaryEmailAddress(_ input: UpdatePrimaryEmailAddressRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdatePrimaryEmailAddressResponse {
        try await self.client.execute(
            operation: "UpdatePrimaryEmailAddress", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates the primary email for a user, group, or resource. The current email is moved into the list of aliases (or swapped between an existing alias and the current primary email), and the email provided in the input is promoted as the primary.
    ///
    /// Parameters:
    ///   - email: The value of the email to be updated as primary.
    ///   - entityId: The user, group, or resource to update. The identifier can accept UseriD, ResourceId, or GroupId, Username, Resourcename, or Groupname, or email. The following identity formats are available:   Entity ID: 12345678-1234-1234-1234-123456789012, r-0123456789a0123456789b0123456789, or S-1-1-12-1234567890-123456789-123456789-1234   Email address: entity@domain.tld   Entity name: entity
    ///   - organizationId: The organization that contains the user, group, or resource to update.
    ///   - logger: Logger use during operation
    @inlinable
    public func updatePrimaryEmailAddress(
        email: String,
        entityId: String,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdatePrimaryEmailAddressResponse {
        let input = UpdatePrimaryEmailAddressRequest(
            email: email, 
            entityId: entityId, 
            organizationId: organizationId
        )
        return try await self.updatePrimaryEmailAddress(input, logger: logger)
    }

    /// Updates data for the resource. To have the latest information, it must be preceded by a DescribeResource call. The dataset in the request should be the one expected when performing another DescribeResource call.
    @Sendable
    @inlinable
    public func updateResource(_ input: UpdateResourceRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateResourceResponse {
        try await self.client.execute(
            operation: "UpdateResource", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates data for the resource. To have the latest information, it must be preceded by a DescribeResource call. The dataset in the request should be the one expected when performing another DescribeResource call.
    ///
    /// Parameters:
    ///   - bookingOptions: The resource's booking options to be updated.
    ///   - description: Updates the resource description.
    ///   - hiddenFromGlobalAddressList: If enabled, the resource is hidden from the global address list.
    ///   - name: The name of the resource to be updated.
    ///   - organizationId: The identifier associated with the organization for which the resource is updated.
    ///   - resourceId: The identifier of the resource to be updated. The identifier can accept ResourceId, Resourcename, or email. The following identity formats are available:   Resource ID: r-0123456789a0123456789b0123456789   Email address: resource@domain.tld   Resource name: resource
    ///   - type: Updates the resource type.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateResource(
        bookingOptions: BookingOptions? = nil,
        description: String? = nil,
        hiddenFromGlobalAddressList: Bool? = nil,
        name: String? = nil,
        organizationId: String,
        resourceId: String,
        type: ResourceType? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateResourceResponse {
        let input = UpdateResourceRequest(
            bookingOptions: bookingOptions, 
            description: description, 
            hiddenFromGlobalAddressList: hiddenFromGlobalAddressList, 
            name: name, 
            organizationId: organizationId, 
            resourceId: resourceId, 
            type: type
        )
        return try await self.updateResource(input, logger: logger)
    }

    /// Updates data for the user. To have the latest information, it must be preceded by a DescribeUser call. The dataset in the request should be the one expected when performing another DescribeUser call.
    @Sendable
    @inlinable
    public func updateUser(_ input: UpdateUserRequest, logger: Logger = AWSClient.loggingDisabled) async throws -> UpdateUserResponse {
        try await self.client.execute(
            operation: "UpdateUser", 
            path: "/", 
            httpMethod: .POST, 
            serviceConfig: self.config, 
            input: input, 
            logger: logger
        )
    }
    /// Updates data for the user. To have the latest information, it must be preceded by a DescribeUser call. The dataset in the request should be the one expected when performing another DescribeUser call.
    ///
    /// Parameters:
    ///   - city: Updates the user's city.
    ///   - company: Updates the user's company.
    ///   - country: Updates the user's country.
    ///   - department: Updates the user's department.
    ///   - displayName: Updates the display name of the user.
    ///   - firstName: Updates the user's first name.
    ///   - hiddenFromGlobalAddressList: If enabled, the user is hidden from the global address list.
    ///   - identityProviderUserId: User ID from the IAM Identity Center. If this parameter is empty it will be updated automatically when the user logs in for the first time to the mailbox associated with WorkMail.
    ///   - initials: Updates the user's initials.
    ///   - jobTitle: Updates the user's job title.
    ///   - lastName: Updates the user's last name.
    ///   - office: Updates the user's office.
    ///   - organizationId: The identifier for the organization under which the user exists.
    ///   - role: Updates the user role. You cannot pass SYSTEM_USER or RESOURCE.
    ///   - street: Updates the user's street address.
    ///   - telephone: Updates the user's contact details.
    ///   - userId: The identifier for the user to be updated. The identifier can be the UserId, Username, or email. The following identity formats are available:   User ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: user@domain.tld   User name: user
    ///   - zipCode: Updates the user's zip code.
    ///   - logger: Logger use during operation
    @inlinable
    public func updateUser(
        city: String? = nil,
        company: String? = nil,
        country: String? = nil,
        department: String? = nil,
        displayName: String? = nil,
        firstName: String? = nil,
        hiddenFromGlobalAddressList: Bool? = nil,
        identityProviderUserId: String? = nil,
        initials: String? = nil,
        jobTitle: String? = nil,
        lastName: String? = nil,
        office: String? = nil,
        organizationId: String,
        role: UserRole? = nil,
        street: String? = nil,
        telephone: String? = nil,
        userId: String,
        zipCode: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) async throws -> UpdateUserResponse {
        let input = UpdateUserRequest(
            city: city, 
            company: company, 
            country: country, 
            department: department, 
            displayName: displayName, 
            firstName: firstName, 
            hiddenFromGlobalAddressList: hiddenFromGlobalAddressList, 
            identityProviderUserId: identityProviderUserId, 
            initials: initials, 
            jobTitle: jobTitle, 
            lastName: lastName, 
            office: office, 
            organizationId: organizationId, 
            role: role, 
            street: street, 
            telephone: telephone, 
            userId: userId, 
            zipCode: zipCode
        )
        return try await self.updateUser(input, logger: logger)
    }
}

extension WorkMail {
    /// Initializer required by `AWSService.with(middlewares:timeout:byteBufferAllocator:options)`. You are not able to use this initializer directly as there are not public
    /// initializers for `AWSServiceConfig.Patch`. Please use `AWSService.with(middlewares:timeout:byteBufferAllocator:options)` instead.
    public init(from: WorkMail, patch: AWSServiceConfig.Patch) {
        self.client = from.client
        self.config = from.config.with(patch: patch)
    }
}

// MARK: Paginators

@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
extension WorkMail {
    /// Return PaginatorSequence for operation ``listAliases(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listAliasesPaginator(
        _ input: ListAliasesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListAliasesRequest, ListAliasesResponse> {
        return .init(
            input: input,
            command: self.listAliases,
            inputKey: \ListAliasesRequest.nextToken,
            outputKey: \ListAliasesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listAliases(_:logger:)``.
    ///
    /// - Parameters:
    ///   - entityId: The identifier for the entity for which to list the aliases.
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - organizationId: The identifier for the organization under which the entity exists.
    ///   - logger: Logger used for logging
    @inlinable
    public func listAliasesPaginator(
        entityId: String,
        maxResults: Int? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListAliasesRequest, ListAliasesResponse> {
        let input = ListAliasesRequest(
            entityId: entityId, 
            maxResults: maxResults, 
            organizationId: organizationId
        )
        return self.listAliasesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listAvailabilityConfigurations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listAvailabilityConfigurationsPaginator(
        _ input: ListAvailabilityConfigurationsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListAvailabilityConfigurationsRequest, ListAvailabilityConfigurationsResponse> {
        return .init(
            input: input,
            command: self.listAvailabilityConfigurations,
            inputKey: \ListAvailabilityConfigurationsRequest.nextToken,
            outputKey: \ListAvailabilityConfigurationsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listAvailabilityConfigurations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - organizationId: The WorkMail organization for which the AvailabilityConfiguration's will be listed.
    ///   - logger: Logger used for logging
    @inlinable
    public func listAvailabilityConfigurationsPaginator(
        maxResults: Int? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListAvailabilityConfigurationsRequest, ListAvailabilityConfigurationsResponse> {
        let input = ListAvailabilityConfigurationsRequest(
            maxResults: maxResults, 
            organizationId: organizationId
        )
        return self.listAvailabilityConfigurationsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listGroupMembers(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listGroupMembersPaginator(
        _ input: ListGroupMembersRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListGroupMembersRequest, ListGroupMembersResponse> {
        return .init(
            input: input,
            command: self.listGroupMembers,
            inputKey: \ListGroupMembersRequest.nextToken,
            outputKey: \ListGroupMembersResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listGroupMembers(_:logger:)``.
    ///
    /// - Parameters:
    ///   - groupId: The identifier for the group to which the members (users or groups) are associated. The identifier can accept GroupId, Groupname, or email. The following identity formats are available:   Group ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: group@domain.tld   Group name: group
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - organizationId: The identifier for the organization under which the group exists.
    ///   - logger: Logger used for logging
    @inlinable
    public func listGroupMembersPaginator(
        groupId: String,
        maxResults: Int? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListGroupMembersRequest, ListGroupMembersResponse> {
        let input = ListGroupMembersRequest(
            groupId: groupId, 
            maxResults: maxResults, 
            organizationId: organizationId
        )
        return self.listGroupMembersPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listGroupsPaginator(
        _ input: ListGroupsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListGroupsRequest, ListGroupsResponse> {
        return .init(
            input: input,
            command: self.listGroups,
            inputKey: \ListGroupsRequest.nextToken,
            outputKey: \ListGroupsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listGroups(_:logger:)``.
    ///
    /// - Parameters:
    ///   - filters: Limit the search results based on the filter criteria. Only one filter per request is supported.
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - organizationId: The identifier for the organization under which the groups exist.
    ///   - logger: Logger used for logging
    @inlinable
    public func listGroupsPaginator(
        filters: ListGroupsFilters? = nil,
        maxResults: Int? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListGroupsRequest, ListGroupsResponse> {
        let input = ListGroupsRequest(
            filters: filters, 
            maxResults: maxResults, 
            organizationId: organizationId
        )
        return self.listGroupsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listGroupsForEntity(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listGroupsForEntityPaginator(
        _ input: ListGroupsForEntityRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListGroupsForEntityRequest, ListGroupsForEntityResponse> {
        return .init(
            input: input,
            command: self.listGroupsForEntity,
            inputKey: \ListGroupsForEntityRequest.nextToken,
            outputKey: \ListGroupsForEntityResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listGroupsForEntity(_:logger:)``.
    ///
    /// - Parameters:
    ///   - entityId: The identifier for the entity. The entity ID can accept UserId or GroupID, Username or Groupname, or email.   Entity ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234   Email address: entity@domain.tld   Entity name: entity
    ///   - filters: Limit the search results based on the filter criteria.
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - organizationId: The identifier for the organization under which the entity exists.
    ///   - logger: Logger used for logging
    @inlinable
    public func listGroupsForEntityPaginator(
        entityId: String,
        filters: ListGroupsForEntityFilters? = nil,
        maxResults: Int? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListGroupsForEntityRequest, ListGroupsForEntityResponse> {
        let input = ListGroupsForEntityRequest(
            entityId: entityId, 
            filters: filters, 
            maxResults: maxResults, 
            organizationId: organizationId
        )
        return self.listGroupsForEntityPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listImpersonationRoles(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listImpersonationRolesPaginator(
        _ input: ListImpersonationRolesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListImpersonationRolesRequest, ListImpersonationRolesResponse> {
        return .init(
            input: input,
            command: self.listImpersonationRoles,
            inputKey: \ListImpersonationRolesRequest.nextToken,
            outputKey: \ListImpersonationRolesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listImpersonationRoles(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results returned in a single call.
    ///   - organizationId: The WorkMail organization to which the listed impersonation roles belong.
    ///   - logger: Logger used for logging
    @inlinable
    public func listImpersonationRolesPaginator(
        maxResults: Int? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListImpersonationRolesRequest, ListImpersonationRolesResponse> {
        let input = ListImpersonationRolesRequest(
            maxResults: maxResults, 
            organizationId: organizationId
        )
        return self.listImpersonationRolesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listMailDomains(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listMailDomainsPaginator(
        _ input: ListMailDomainsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListMailDomainsRequest, ListMailDomainsResponse> {
        return .init(
            input: input,
            command: self.listMailDomains,
            inputKey: \ListMailDomainsRequest.nextToken,
            outputKey: \ListMailDomainsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listMailDomains(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - organizationId: The WorkMail organization for which to list domains.
    ///   - logger: Logger used for logging
    @inlinable
    public func listMailDomainsPaginator(
        maxResults: Int? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListMailDomainsRequest, ListMailDomainsResponse> {
        let input = ListMailDomainsRequest(
            maxResults: maxResults, 
            organizationId: organizationId
        )
        return self.listMailDomainsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listMailboxExportJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listMailboxExportJobsPaginator(
        _ input: ListMailboxExportJobsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListMailboxExportJobsRequest, ListMailboxExportJobsResponse> {
        return .init(
            input: input,
            command: self.listMailboxExportJobs,
            inputKey: \ListMailboxExportJobsRequest.nextToken,
            outputKey: \ListMailboxExportJobsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listMailboxExportJobs(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - organizationId: The organization ID.
    ///   - logger: Logger used for logging
    @inlinable
    public func listMailboxExportJobsPaginator(
        maxResults: Int? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListMailboxExportJobsRequest, ListMailboxExportJobsResponse> {
        let input = ListMailboxExportJobsRequest(
            maxResults: maxResults, 
            organizationId: organizationId
        )
        return self.listMailboxExportJobsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listMailboxPermissions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listMailboxPermissionsPaginator(
        _ input: ListMailboxPermissionsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListMailboxPermissionsRequest, ListMailboxPermissionsResponse> {
        return .init(
            input: input,
            command: self.listMailboxPermissions,
            inputKey: \ListMailboxPermissionsRequest.nextToken,
            outputKey: \ListMailboxPermissionsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listMailboxPermissions(_:logger:)``.
    ///
    /// - Parameters:
    ///   - entityId: The identifier of the user, or resource for which to list mailbox permissions. The entity ID can accept UserId or ResourceId, Username or Resourcename, or email.   Entity ID: 12345678-1234-1234-1234-123456789012, or r-0123456789a0123456789b0123456789   Email address: entity@domain.tld   Entity name: entity
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - organizationId: The identifier of the organization under which the user, group, or resource exists.
    ///   - logger: Logger used for logging
    @inlinable
    public func listMailboxPermissionsPaginator(
        entityId: String,
        maxResults: Int? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListMailboxPermissionsRequest, ListMailboxPermissionsResponse> {
        let input = ListMailboxPermissionsRequest(
            entityId: entityId, 
            maxResults: maxResults, 
            organizationId: organizationId
        )
        return self.listMailboxPermissionsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listMobileDeviceAccessOverrides(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listMobileDeviceAccessOverridesPaginator(
        _ input: ListMobileDeviceAccessOverridesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListMobileDeviceAccessOverridesRequest, ListMobileDeviceAccessOverridesResponse> {
        return .init(
            input: input,
            command: self.listMobileDeviceAccessOverrides,
            inputKey: \ListMobileDeviceAccessOverridesRequest.nextToken,
            outputKey: \ListMobileDeviceAccessOverridesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listMobileDeviceAccessOverrides(_:logger:)``.
    ///
    /// - Parameters:
    ///   - deviceId: The mobile device to which the access override applies.
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - organizationId: The WorkMail organization under which to list mobile device access overrides.
    ///   - userId: The WorkMail user under which you list the mobile device access overrides. Accepts the following types of user identities:   User ID: 12345678-1234-1234-1234-123456789012 or S-1-1-12-1234567890-123456789-123456789-1234    Email address: user@domain.tld    User name: user
    ///   - logger: Logger used for logging
    @inlinable
    public func listMobileDeviceAccessOverridesPaginator(
        deviceId: String? = nil,
        maxResults: Int? = nil,
        organizationId: String,
        userId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListMobileDeviceAccessOverridesRequest, ListMobileDeviceAccessOverridesResponse> {
        let input = ListMobileDeviceAccessOverridesRequest(
            deviceId: deviceId, 
            maxResults: maxResults, 
            organizationId: organizationId, 
            userId: userId
        )
        return self.listMobileDeviceAccessOverridesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listOrganizations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listOrganizationsPaginator(
        _ input: ListOrganizationsRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListOrganizationsRequest, ListOrganizationsResponse> {
        return .init(
            input: input,
            command: self.listOrganizations,
            inputKey: \ListOrganizationsRequest.nextToken,
            outputKey: \ListOrganizationsResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listOrganizations(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - logger: Logger used for logging
    @inlinable
    public func listOrganizationsPaginator(
        maxResults: Int? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListOrganizationsRequest, ListOrganizationsResponse> {
        let input = ListOrganizationsRequest(
            maxResults: maxResults
        )
        return self.listOrganizationsPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listPersonalAccessTokens(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listPersonalAccessTokensPaginator(
        _ input: ListPersonalAccessTokensRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListPersonalAccessTokensRequest, ListPersonalAccessTokensResponse> {
        return .init(
            input: input,
            command: self.listPersonalAccessTokens,
            inputKey: \ListPersonalAccessTokensRequest.nextToken,
            outputKey: \ListPersonalAccessTokensResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listPersonalAccessTokens(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults:  The maximum amount of items that should be returned in a response.
    ///   - organizationId:  The Organization ID.
    ///   - userId:  The WorkMail User ID.
    ///   - logger: Logger used for logging
    @inlinable
    public func listPersonalAccessTokensPaginator(
        maxResults: Int? = nil,
        organizationId: String,
        userId: String? = nil,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListPersonalAccessTokensRequest, ListPersonalAccessTokensResponse> {
        let input = ListPersonalAccessTokensRequest(
            maxResults: maxResults, 
            organizationId: organizationId, 
            userId: userId
        )
        return self.listPersonalAccessTokensPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listResourceDelegates(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listResourceDelegatesPaginator(
        _ input: ListResourceDelegatesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListResourceDelegatesRequest, ListResourceDelegatesResponse> {
        return .init(
            input: input,
            command: self.listResourceDelegates,
            inputKey: \ListResourceDelegatesRequest.nextToken,
            outputKey: \ListResourceDelegatesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listResourceDelegates(_:logger:)``.
    ///
    /// - Parameters:
    ///   - maxResults: The number of maximum results in a page.
    ///   - organizationId: The identifier for the organization that contains the resource for which delegates are listed.
    ///   - resourceId: The identifier for the resource whose delegates are listed. The identifier can accept ResourceId, Resourcename, or email. The following identity formats are available:   Resource ID: r-0123456789a0123456789b0123456789   Email address: resource@domain.tld   Resource name: resource
    ///   - logger: Logger used for logging
    @inlinable
    public func listResourceDelegatesPaginator(
        maxResults: Int? = nil,
        organizationId: String,
        resourceId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListResourceDelegatesRequest, ListResourceDelegatesResponse> {
        let input = ListResourceDelegatesRequest(
            maxResults: maxResults, 
            organizationId: organizationId, 
            resourceId: resourceId
        )
        return self.listResourceDelegatesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listResources(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listResourcesPaginator(
        _ input: ListResourcesRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListResourcesRequest, ListResourcesResponse> {
        return .init(
            input: input,
            command: self.listResources,
            inputKey: \ListResourcesRequest.nextToken,
            outputKey: \ListResourcesResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listResources(_:logger:)``.
    ///
    /// - Parameters:
    ///   - filters: Limit the resource search results based on the filter criteria. You can only use one filter per request.
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - organizationId: The identifier for the organization under which the resources exist.
    ///   - logger: Logger used for logging
    @inlinable
    public func listResourcesPaginator(
        filters: ListResourcesFilters? = nil,
        maxResults: Int? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListResourcesRequest, ListResourcesResponse> {
        let input = ListResourcesRequest(
            filters: filters, 
            maxResults: maxResults, 
            organizationId: organizationId
        )
        return self.listResourcesPaginator(input, logger: logger)
    }

    /// Return PaginatorSequence for operation ``listUsers(_:logger:)``.
    ///
    /// - Parameters:
    ///   - input: Input for operation
    ///   - logger: Logger used for logging
    @inlinable
    public func listUsersPaginator(
        _ input: ListUsersRequest,
        logger: Logger = AWSClient.loggingDisabled
    ) -> AWSClient.PaginatorSequence<ListUsersRequest, ListUsersResponse> {
        return .init(
            input: input,
            command: self.listUsers,
            inputKey: \ListUsersRequest.nextToken,
            outputKey: \ListUsersResponse.nextToken,
            logger: logger
        )
    }
    /// Return PaginatorSequence for operation ``listUsers(_:logger:)``.
    ///
    /// - Parameters:
    ///   - filters: Limit the user search results based on the filter criteria. You can only use one filter per request.
    ///   - maxResults: The maximum number of results to return in a single call.
    ///   - organizationId: The identifier for the organization under which the users exist.
    ///   - logger: Logger used for logging
    @inlinable
    public func listUsersPaginator(
        filters: ListUsersFilters? = nil,
        maxResults: Int? = nil,
        organizationId: String,
        logger: Logger = AWSClient.loggingDisabled        
    ) -> AWSClient.PaginatorSequence<ListUsersRequest, ListUsersResponse> {
        let input = ListUsersRequest(
            filters: filters, 
            maxResults: maxResults, 
            organizationId: organizationId
        )
        return self.listUsersPaginator(input, logger: logger)
    }
}

extension WorkMail.ListAliasesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListAliasesRequest {
        return .init(
            entityId: self.entityId,
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId
        )
    }
}

extension WorkMail.ListAvailabilityConfigurationsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListAvailabilityConfigurationsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId
        )
    }
}

extension WorkMail.ListGroupMembersRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListGroupMembersRequest {
        return .init(
            groupId: self.groupId,
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId
        )
    }
}

extension WorkMail.ListGroupsForEntityRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListGroupsForEntityRequest {
        return .init(
            entityId: self.entityId,
            filters: self.filters,
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId
        )
    }
}

extension WorkMail.ListGroupsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListGroupsRequest {
        return .init(
            filters: self.filters,
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId
        )
    }
}

extension WorkMail.ListImpersonationRolesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListImpersonationRolesRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId
        )
    }
}

extension WorkMail.ListMailDomainsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListMailDomainsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId
        )
    }
}

extension WorkMail.ListMailboxExportJobsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListMailboxExportJobsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId
        )
    }
}

extension WorkMail.ListMailboxPermissionsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListMailboxPermissionsRequest {
        return .init(
            entityId: self.entityId,
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId
        )
    }
}

extension WorkMail.ListMobileDeviceAccessOverridesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListMobileDeviceAccessOverridesRequest {
        return .init(
            deviceId: self.deviceId,
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId,
            userId: self.userId
        )
    }
}

extension WorkMail.ListOrganizationsRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListOrganizationsRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token
        )
    }
}

extension WorkMail.ListPersonalAccessTokensRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListPersonalAccessTokensRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId,
            userId: self.userId
        )
    }
}

extension WorkMail.ListResourceDelegatesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListResourceDelegatesRequest {
        return .init(
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId,
            resourceId: self.resourceId
        )
    }
}

extension WorkMail.ListResourcesRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListResourcesRequest {
        return .init(
            filters: self.filters,
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId
        )
    }
}

extension WorkMail.ListUsersRequest: AWSPaginateToken {
    @inlinable
    public func usingPaginationToken(_ token: String) -> WorkMail.ListUsersRequest {
        return .init(
            filters: self.filters,
            maxResults: self.maxResults,
            nextToken: token,
            organizationId: self.organizationId
        )
    }
}
